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