spring security
2020-02-04 09:36:22 4 举报
AI智能生成
spring security 知识点大纲,spring security 核心组件及原理和认证流程,过滤器作用,参考链接等
作者其他创作
大纲/内容
核心组件
SecurityContext
安全上下文
SecurityContextHolder<br>
存储当前认证信息
MODE_THREADLOCAL
SecurityContext 存储在线程中
MODE_INHERITABLETHREADLOCAL
SecurityContext 存储在线程中,但子线程可以获取到父线程中的 SecurityContext
MODE_GLOBAL
SecurityContext 在所有线程中都相同
Authentication<br>
表示当前用户是谁,可以理解为authentication就是一组用户名密码信息
实现
UsernamePasswordAuthenticationToken
AnonymousAuthenticationToken
接口方法<br>
Collection<? extends GrantedAuthority> getAuthorities();<br>
获取权限信息(不能仅仅理解未角色权限,还有菜单权限等等),默认是GrantedAuthority接口的实现类<br>
Object getCredentials();<br>
获取用户密码信息 ,认证成功后会被删除掉
Object getDetails();<br>
主要存放访问着的ip等信息<br>
Object getPrincipal();<br>
最重要的身份信息。 大部分情况下是 UserDetails 接口的实现 类,比如User 对象 <br>
boolean isAuthenticated();
是否认证(成功)
void setAuthenticated(boolean isAuthenticated)
设置认证标识
UserDetailsService
通过方法loadUserByUsername获取UserDetails
UserDetails
存储用户信息
实现
org.springframework.security.core.userdetails.User
AuthenticationManager
校验Authentication
Authentication authenticate(Authentication authentication)
实现
ProviderManager<br>
AuthenticationProvider
List<AuthenticationProvider> providers
ActiveDirectoryLdapAuthenticationProvider
DaoAuthenticationProvider
LdapAuthenticationProvider
......
接口方法
Authentication authenticate(Authentication authentication)
认证
boolean supports(Class<?> authentication);<br>
校验是证类型否认匹配
工作原理/认证流程
@EnableWebSecurity
加载:WebSecurityConfiguration
创建:springSecurityFilterChain(返回FilterChainProxy)
List<SecurityFilterChain> filterChains
List<Filter> filters;
ChannelProcessingFilter
可能需要重定向到不同的协议<br>
SecurityContextPersistenceFilter<br>
请求时:web请求开头的SecurityContextHolder中设置SecurityContext
结束时:SecurityContext的任何更改都可以复制到HttpSession当web请求
清空SecurityContext
ConcurrentSessionFilter
身份认证
AbstractAuthenticationProcessingFilter
UsernamePasswordAuthenticationFilter
requiresAuthentication()判断 是否以POST 方式请求 /login
attemptAuthentication() 方法进行认证
内部创建了 authenticated 属性为 false(即未授权)的UsernamePasswordAuthenticationToken 对象
AuthenticationManager
递给 AuthenticationManager().authenticate() 方法进行认证
认证成功后 返回一个 authenticated = true (即授权成功的)UsernamePasswordAuthenticationToken 对象
sessionStrategy.onAuthentication() 将 Authentication 放入Session中
结果处理
successfulAuthentication() 调用 AuthenticationSuccessHandler 的 onAuthenticationSuccess 接口 进行成功处理
继承 AuthenticationSuccessHandler 自行编写成功处理逻辑
unsuccessfulAuthentication() 调用AuthenticationFailureHandler 的 onAuthenticationFailure 接口 进行失败处理
通过继承AuthenticationFailureHandler 自行编写失败处理逻辑
BasicAuthenticationFilter
从Header 中获取 Authorization 参数信息
调用认证,认证成功后最后直接访问接口
onSuccessfulAuthentication() 成功处理方法是一个空方法
RememberMeAuthenticationFilter
AnonymousAuthenticationFilter
Security中不存在没有账户这一说法
前面所有filter都认证失败的情况下,自动创建一个默认的匿名用户,拥有匿名访问权限
ExceptionTranslationFilter<br>
捕获AuthenticationException 和AccessDeniedException
调用 handleSpringSecurityException()方法进行处理<br>
FilterSecurityInterceptor
判断认证成功的用户是否有权限访问接口
调用父类(AbstractSecurityInterceptor)的 super.beforeInvocation(fi)
通过 obtainSecurityMetadataSource().getAttributes() 获取 当前访问地址所需权限信息
通过 authenticateIfRequired() 获取当前访问用户的权限信息
通过 accessDecisionManager.decide() 使用 投票机制判权,判权失败直接抛出 AccessDeniedException 异常
创建详情
WebSecurity:performBuild()
@EnableGlobalAuthentication
AuthenticationConfiguration
getAuthenticationManager()<br>
通过调用 authenticationManagerBuilder() 方法获取 authenticationManagerBuilder 对象
调用authenticationManagerBuilder 对象的 build() 创建 authenticationManager 对象并返回
AuthenticationManagerBuilder.performBuild()
AuthenticationManager(实现ProviderManager)<br>
DelegatingFilterProxy
没有实际的过滤逻辑,寻找并委托给filter-name(springSecurityFilterChain)节点所配置filter
参考
Spring高级篇—Spring Security入门原理及实战
Spring Security 解析(一) —— 授权过程
官方文档
0 条评论
下一页