spring Security工作原理

spring Security工作原理总括

  对于请求的拦截使用的技术一般采用Filter或者AOP的技术,spring Security就是采用的Filter进行拦截。

当初始化spring Security时,会创建一个名为SpringSecurityFilterChain的Servlet过滤器,

类型为org.springframework.security.web.FilterChainProxy,他实现了javax.servlet.Filter,因此外部的请求会进过此类。

spring Security过滤器链的结果大致为:

  FilterChainProxy  ----->FIlter1----->FIlter2----->FIlter...----->system resource

  其中认证的FIlter调用的是AuthenticationManger干活

  其中授权的FIlter调用的是accessDesionManager干活

首先请求过来后传入到第一个Filter,为SecurityContextPersistenceFilter,接着会到判断用户身份的Filter,为

UsernamePasswordAuthencationFIlter,来校验用户身份,当然这会委托AuthenticationManager来校验。

然后再传入其他Filter进行处理。

SecurityContextPersistenceFIlter是整个过滤器链的第一个Filter(入出口)主要做一些上下文的初始化工作,

授权的Filter由FilterSecurityInterceptor来做,当然这是委托AccessDesionManager来做。

如果抛出异常,则由ExceptionTransationFilter来进行处理。

================================================================================

认证流程(大致)

首先用户提交用户名密码后,将封装用户密码的请求会发送到UsernamePasswordAuthenticationFilter中,然后

调用authenticate()交给认证器AuthenticationManager来进行处理,AuthenticationManager也不是最终干活的,

他会调用authenticate()方法交给DaoAutnenticationProvider来最终干活,DaoAutnenticationProvider通过调用

loadUserByUsername()方法访问UserDetailsServer服务获取用户信息,返回的UserDetails对象,包含了数据库中的用户信息。

DaoAutnenticationProvider拿到了用户信息后,会调用以前讲过的PasswordEncoder对比UserDetails中的密码是否一致,

认证通过会将用户信息填充到Authentication中并且返回到UsernamePasswordAuthenticationFilter,

UsernamePasswordAuthenticationFilter通过SecurityContextHolder.getcontext().setAuthentication()将Authentication

的认证信息保存到上下文中。认证就结束了。

猜你喜欢

转载自www.cnblogs.com/dengw125792/p/12285530.html
今日推荐