克服自己消极的、钻牛角尖的扭曲的思想方式,便能增加效率,提高自尊心
文章目录
1.基础知识点
为了理解Security Oauth2 我们要先理解Security ;理解Security ,我们需要先做一些Security组件等基础认识的认识。
Security组件的认识
-
SecurityContextHolder:用来存储安全上下文信息,Spring Security 的校验之后,验证信息存储在SecurityContext
-
Authentication: 在Security领域,用户密码等不叫做用户密码,叫做Authentication。Authentication 在 spring security 中是最高级别的身份 / 认证的抽象。 在进入Security领域前,得把信息封装成Authentication.(如果用一成语来形容,就是入乡随俗),例如我们常用的
[clientId,clientSecret ] [username,password]
都可以封装成一个(Authentication)UsernamePasswordAuthenticationToken
-
AuthenticationManager: 从组件层面讲,此组件是用来校验
Authentication
,常见实现类有ProviderManager。但是从代码层面,ProviderManager 将校验的工作交给了另一个组件AuthenticationProvider来完成的。ProviderManager 中维护一个List<AuthenticationProvider>
,通过遍历找到支持当前Authentication
认证的AuthenticationProvider,交给其进行认证。(这样看AuthenticationManager可以看做是大总管) -
AuthenticationProvider: 就是上面说的代码层面真正对
Authentication
进行校验的组件。常见的AuthenticationProvider有(1.DaoAuthenticationProvider: Dao式认证Provider ,从数据库中取出信息与提交的信息进行比对,完成认证。
(2. AnonymousAuthenticationProvider: 匿名认证Provider
-
UserDetails : 理解UserDetails,我们可以对比Authentication来理解, Authentication是来自用户提交的数据封装,UserDetails 是从数据层获取的用户信息封装。
-
UserDetailsService :
DaoAuthenticationProvider
认证器从数据库层取数据是通过UserDetailsService 完成的,取到的是UserDetails 。常见的UserDetailsService(1.JdbcDaoImpl
(2.ClientDetailsUserDetailsService: 查询[clientId,clientSecret ]形式的UserDetails
Filter-Servlet
我们都知道请求经过Filter链到Servlet
过程看起来是这样
Security原理
牢记,Spring Security在web应用中,是通过filter 介入的。
为了介入到主体ApplicationFilterChain中,这里要介绍一个特殊的Filter ,
DelegatingFilterProxy:
这个Filter很有意思,他内部有一个Filter delegate
属性 ,用来代理另一个Filter。当请求执行到DelegatingFilterProxy时,会调用delegate 这个Filter 。DelegatingFilterProxy可以看做是一个可以让Filter链拐弯的 Filter
FilterChainProxy:
也是一个Filter , Security就是通过把他设置到DelegatingFilterProxy.delegate
属性上来介入了主体FilterChain .但是从他名称来看他本身也是一个代理性质的FIlter
他内部维护了一个List<SecurityFilterChain> filterChains
来表示不同权限的url对应的不同的过滤器链 ,但是一次请求最多只有一个SpringSecurityFilterChain链。
SpringSecurityFilterChain:
FilterChainProxy遍历List<SecurityFilterChain> filterChains
匹配到一个适用于当前请求的SecurityFilterChain然后就是链式调用了。
Security 常见Filter:
-
SecurityContextPersistenceFilter: 位于SecurityFilterChain的顶端。以前我们使用session来存储用户信息,用了Security框架后,用户登录一次,后续通过sessionId 来识别,用户信息存放到SecurityContextHolder中,这个放入的过程就是SecurityContextPersistenceFilter完成的。SecurityContextPersistenceFilter的主要工作创建
SecurityContext
安全上下文信息和请求结束时清空SecurityContextHolder
(用了try,finally组合) -
UsernamePasswordAuthenticationFilter:表单认证是最常用的一个认证方式,允许表单输入用户名和密码进行登录。他会先将
[username,password]
封装成Authentication然后交给authenticationManager 认证,authenticationManager 会选择一个provider ,通过UserDetailsService从redis获取mysql等数据层面获得存储用户信息的数据的UserDetail与Authentication 进行对比。认证成功 -
ExceptionTranslationFilter: 异常转换过滤器位于整个 springSecurityFilterChain 的后方,主要处理两大异常,AccessDeniedException 访问异常和 AuthenticationException 认证异常。根据配置和异常类型,会选择跳转到登录页面,或者404 ,405页面。
代码层面的集成:
代码中使用Security 最重要的是@E