springSecurity随笔

来源:互联网 发布:js判断display none 编辑:程序博客网 时间:2024/05/22 17:26

我们用springSecurity处理权限时,需要做一个持久化过程,生成securityContext保存数据,然后放入session。

SecurityContextPersistenceFilter主要是在SecurityContextRepository中保存更新一个securityContext,并将securityContext给以后的过滤器使用

本质上就是在session中生成一个securityContext——httpSession.setAttribute(springSecurityContextKey, context);

它的逻辑是这样的

一、SecurityContextRepository.loadContext(),返回一个securityContext

   loadContext里面的逻辑是这样的:

1、 判断session是否存在,如果存在先尝试从session中httpSession.getAttribute(springSecurityContextKey)获取securityContext,获取不到或则session不存在,返回null

2、判断securityContext是否为null,为null则新建一个securityContextImpl

3、将当前的securityContext的信息备份到SaveToSessionResponseWrapper,用户在后面的saveContext进行比较处理

4、返回一个securityContext

二、将securiryContext放入SecurityContextHolder中

三、执行下面的过滤器chain.doFilter(holder.getRequest(), holder.getResponse());

四、运行完SecurityContextPersistenceFilter之后的所有过滤器,清空SecurityContextHolder中的securityContext,并将securityContext(这个securityContext保存有后面过滤器生成的数据)放入SecurityContextRepository中,也就是执行SecurityContextRepository.saveContext();

saveContext的逻辑如下

1、 判断SecurityContext中的authentication是否为空或者是不是Anonymous角色,

       如果是的话再判断session是否存在,如果session存在并且securityContext不为空的话,就从session将securityContext删除

      这个的作用是如果你的权限过期了或者不具有权限,那么session就不不应该还存在securityContext

2、判断session是否为空,如果不为空,则比较securityContext是否有更新过(会与SaveToSessionResponseWrapper中的securityContext内容作比较),有的话,就更新下一下httpSession.setAttribute(springSecurityContextKey, context);


总结:由此可见SecurityContextPersistenceFilter主要是维护securityContext给后面的过滤器使用

0 0