登录认证和动态权限图示

一、相关组件
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 投票
//配置自定义 投票管理器@Beanpublic 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>() {@Overridepublic <O extends FilterSecurityInterceptor> O postProcess(O fsi) {fsi.setSecurityMetadataSource(mySecurityMetadataSource(fsi.getSecurityMetadataSource()));return fsi;}})
1.5、 AccessDecisionManager 访问决策管理者
//配置自定义 决策管理器@Overrideprotected 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、决策通过,则放行访问
