目录
一、SpringSecurity 核心组件介绍
SecurityContextHolder
SecurityContext
AuthenticationManager
ProviderManager
AuthenticationProvider
Authentication
GrantedAuthority
UserDetails
UserDetailsService
二、认证流程
1、图片流程
2、在SpringBoot中的代码实现
待续写~~~~~~~~~~
三、spring security 内置拦截器顺序及用途
一、SpringSecurity 核心组件介绍
SecurityContextHolder
SecurityContextHolder它持有的是安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权等等,这些都被保存
SecurityContextHolder默认使用ThreadLocal 策略来存储认证信息。看到ThreadLocal 也就意味着,这是一种与线程绑定的策略。在web环境下,Spring Security在用户登录时自动绑定认证信息到当前线程,在用户退出时,自动清除当前线程的认证信息。
SecurityContext
持有Authentication对象和其他可能需要的信息
AuthenticationManager
AuthenticationManager 其中可以包含多个AuthenticationProvider
ProviderManager
ProviderManager对象为AuthenticationManager接口的实现类
AuthenticationProvider
AuthenticationProvider 主要用来进行认证操作的类 调用其中的authenticate()方法去进行认证操作
Authentication
Authentication:Spring Security方式的认证主体
鉴权对象,该对象主要包含了用户的详细信息(UserDetails)和用户鉴权时所需要的信息,如用户提交的用户名密码、Remember-me Token,或者digest hash值等,
GrantedAuthority
GrantedAuthority:对认证主题的应用层面的授权,含当前用户的权限信息,通常使用角色表示
UserDetails
UserDetails:构建Authentication对象必须的信息,可以自定义,可能需要访问DB得到
这个接口规范了用户详细信息所拥有的字段,譬如用户名、密码、账号是否过期、是否锁定等。在Spring Security中,获取当前登录的用户的信息,一般情况是需要在这个接口上面进行扩展,用来对接自己系统的用户
UserDetailsService
UserDetailsService:通过username构建UserDetails对象,通过loadUserByUsername根据userName获取UserDetail对象 (可以在这里基于自身业务进行自定义的实现 如通过数据库,xml,缓存获取等)
通过扩展这个接口来显示获取我们的用户信息,用户登陆时传递的用户名和密码也是通过这里这查找出来的用户名和密码进行校验,但是真正的校验不在这里,而是由AuthenticationManager以及AuthenticationProvider负责的,需要强调的是,如果用户不存在,不应返回NULL,而要抛出异常UsernameNotFoundException
二、认证流程
1、图片流程
整体流程:
(上图来自: 小编在此表示感谢)
这样理解也行:
认证详细流程:
认证完成后:
2、在SpringBoot中的代码实现
待续写~~~~~~~~~~
三、spring security 内置拦截器顺序及用途
1、ChannelProcessingFilter,使用它因为我们可能会指向不同的协议(如:Http,Https)
2、SecurityContextPersistenceFilter,负责从SecurityContextRepository 获取或存储 SecurityContext。SecurityContext 代表了用户安全和认证过的session
3、ConcurrentSessionFilter,使用SecurityContextHolder的功能,更新来自“安全对象”不间断的请求,进而更新SessionRegistry
4、认证进行机制,UsernamePasswordAuthenticationFilter,CasAuthenticationFilter,BasicAuthenticationFilter等等--SecurityContextHolder可能会修改含有Authentication这样认证信息的token值
5、SecurityContextHolderAwareRequestFilter,如果你想用它的话,需要初始化spring security中的HttpServletRequestWrapper到你的servlet容器中。
6、JaasApiIntegrationFilter,如果JaasAuthenticationToken在SecurityContextHolder的上下文中,在过滤器链中JaasAuthenticationToken将作为一个对象。
7、RememberMeAuthenticationFilter,如果还没有新的认证程序机制更新SecurityContextHolder,并且请求已经被一个“记住我”的服务替代,那么将会有一个Authentication对象将存放到这(就是 已经作为cookie请求的内容)。
8、AnonymousAuthenticationFilter,如果没有任何认证程序机制更新SecurityContextHolder,一个匿名的对象将存放到这。
9、ExceptionTranslationFilter,为了捕获spring security的错误,所以一个http响应将返回一个Exception或是触发AuthenticationEntryPoint。
10、FilterSecurityInterceptor,当连接被拒绝时,保护web URLS并且抛出异常。