SecurityContext

我们用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给后面的过滤器使用

在Spring Security中,跨请求安全上下文SecurityContext的保持,是通过SecurityContextPersistenceFilter来实现的,缺省情况下,SecurityContextPersistenceFilter将安全上下文SecurityContext对象保存为当前用户HttpSession对象的一个属性,这样,当前用户在同一个会话的多个请求之间,就可以使用同一个安全上下文对象了。

具体来讲,可以理解为如下流程:

    一个安全上下文在某个请求1处理过程中被创建并记录到SecurityContextHolder;
    请求1的处理结束时,SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文保存到HttpSession;
    后续该用户会话中的另外一个请求2处理过程开始时,SecurityContextPersistenceFilter会将安全上下文从HttpSession恢复到SecurityContextHolder;
    请求2处理过程结束时,SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文保存到HttpSession;
    后续其他请求的处理过程会重复和上面请求2处理过程中一样的使用SecurityContextPersistenceFilter重置/恢复SecurityContext的动作
 

猜你喜欢

转载自blog.csdn.net/asdfsadfasdfsa/article/details/84068959
今日推荐