登录认证和动态权限图示
一、相关组件
1.1、UserDetailsService 和 UserDetails 接口
主要用于从数据库中获取信息进行自定义身份认证
UserDetailsService
//通过账号获取用户名信息
public interface UserDetailsService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
UserDetails
UserDetails 接口定义了用于描述用户信息的方法
public interface UserDetails extends Serializable {
//获取关联权限
Collection<? extends GrantedAuthority> getAuthorities();
//获取密码
String getPassword();
//获取用户名
String getUsername();
//账号是否过期
boolean isAccountNonExpired();
//账号是否被锁
boolean isAccountNonLocked();
//密码是否过期
boolean isCredentialsNonExpired();
//账号是否启用
boolean isEnabled();
1.2、验证处理接口
- UsernamePasswordAuthenticationFilter
1.3、AccessDecisionVoter 投票
//配置自定义 投票管理器
@Bean
public AccessDecisionManager accessDecisionManager() {
List<AccessDecisionVoter<? extends Object>> decisionVoters
= Arrays.asList(
new WebExpressionVoter(),
new RoleVoter(),
new AuthenticatedVoter(),
new MinuteBasedVoter());
return new UnanimousBased(decisionVoters);
}
1.4、FilterInvocationSecurityMetadataSource 权限资源获取
http.anyRequest()
.authenticated()
// 自定义FilterInvocationSecurityMetadataSource
.withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
@Override
public <O extends FilterSecurityInterceptor> O postProcess(
O fsi) {
fsi.setSecurityMetadataSource(mySecurityMetadataSource(fsi.getSecurityMetadataSource()));
return fsi;
}
})
1.5、 AccessDecisionManager 访问决策管理者
//配置自定义 决策管理器
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.anyRequest()
.authenticated()
.accessDecisionManager(accessDecisionManager());
}
二、登录认证流程
- 图示
- 流程介绍
- 1、用户填写用户名密码提交表单
- 2、请求被Spring Security UsernamePasswordAuthenticationFilter 过滤器拦截
- 3、在过滤器中获取 AuthenticationManager 认证管理器 筛选匹配的 AuthenticationProvider 进行认证
- 4、 在 DaoAuthenticationProvider (AuthenticationProvider 的实现)中检索用户 ,调用 UserDetailsService
- 5、前置检查 UserDetailsChecker 检查用户状态
- 6、PasswordEncoder 验证密码是否正确
- 7、后置检查 UserDetailsChecker 检查用户状态
- 8、认证成功,封装为 Authentication 类
- 9、保存到上下文中(ThreadLocal) SecurityContextHolder.getContext().setAuthentication(authResult);
三、权限认证流程
- 图示
- 流程介绍
- 1、访问需要权限的资源
- 2、使用 FilterInvocationSecurityMetadataSource 获取当前访问资源需要的权限
- 3、AccessDecisionManager 进行授权决策
- 4、AccessDecisionVoter 投票决策
- 5、决策通过,则放行访问