spring|SpringSecurity过滤器原理( 二 )


  • RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时 从 cookie 里找出用户的信息 如果 Spring Security 能够识别出用户提供的remember me cookie 用户将不必填写用户名和密码 而是直接登录进入系统 , 该过滤器默认不开启 。
  • SecurityContextHolderSecurityContext对象是安全上下文信息 , 包括当前使用系统的用户的信息 。 每个用户都会有它的安全上下文对象 , 所以把每一个用户的SecurityContext保存到SecurityContextHolder中 。
    SecurityContextHolder存储SecurityContext的方式根据应用场景不同也有区别:
    (1)单机系统 , 即应用从开启到关闭的整个生命周期只有一个用户在使用 。 由于整个应用只需要保存一个SecurityContext(安全上下文即可)
    (2)多用户系统 , 比如典型的Web系统 , 整个生命周期可能同时有多个用户在使用 。 这时候应用需要保存多个SecurityContext(安全上下文) , 需要利用ThreadLocal进行保存 , 每个线程都可以利用ThreadLocal获取其自己的SecurityContext , 及安全上下文 。 ThreadLocal内部会用数组来存储多个对象的 。 原理是 , ThreadLocal会为每个线程开辟一个存储区域 , 来存储相应的对象 。
    Authentication:用户信息的表示
    在SecurityContextHolder中存储了当前与系统交互的用户的信息 。 Spring Security使用一个Authentication 对象来表示这些信息 。
    Authentication 主要包含了:
    • 用户权限集合
    • 用户证书(密码)
    • 细节(Details)
    • Principal(就是这个用户的账户信息)
    在自定义登录认证过滤器的时候 , 记得需要把用户的信息(Authentication )保存到SecurityContextHolder中 , 以便后续用户的正常使用 。 比如我在做和Jwt认证的整合的时候 , 继承OncePerRequestFilter , 重写doFilterInternal方法 , 认证完token之后 , 就需要把用户的信息存入安全上下文Holder中 。
    UsernamePasswordAuthenticationToken authenticationToken
       =new UsernamePasswordAuthenticationToken(usernull null);
    authenticationToken.setDetails(new WebAuthenticationDetailsSource()
                                  .buildDetails(request));

    SecurityContextHolder.getContext().setAuthentication(authenticationToken);


    【spring|SpringSecurity过滤器原理】原文地址:
    http://www.cnblogs.com/ins1mnia/p/15635130.html