登录认证和动态权限图示

image.png

一、相关组件

1.1、UserDetailsService 和 UserDetails 接口

主要用于从数据库中获取信息进行自定义身份认证

  • UserDetailsService

    1. //通过账号获取用户名信息
    2. public interface UserDetailsService {
    3. UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    4. }
  • UserDetails

UserDetails 接口定义了用于描述用户信息的方法

  1. public interface UserDetails extends Serializable {
  2. //获取关联权限
  3. Collection<? extends GrantedAuthority> getAuthorities();
  4. //获取密码
  5. String getPassword();
  6. //获取用户名
  7. String getUsername();
  8. //账号是否过期
  9. boolean isAccountNonExpired();
  10. //账号是否被锁
  11. boolean isAccountNonLocked();
  12. //密码是否过期
  13. boolean isCredentialsNonExpired();
  14. //账号是否启用
  15. boolean isEnabled();

1.2、验证处理接口

  • UsernamePasswordAuthenticationFilter

1.3、AccessDecisionVoter 投票

  1. //配置自定义 投票管理器
  2. @Bean
  3. public AccessDecisionManager accessDecisionManager() {
  4. List<AccessDecisionVoter<? extends Object>> decisionVoters
  5. = Arrays.asList(
  6. new WebExpressionVoter(),
  7. new RoleVoter(),
  8. new AuthenticatedVoter(),
  9. new MinuteBasedVoter());
  10. return new UnanimousBased(decisionVoters);
  11. }

1.4、FilterInvocationSecurityMetadataSource 权限资源获取

  1. http.anyRequest()
  2. .authenticated()
  3. // 自定义FilterInvocationSecurityMetadataSource
  4. .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
  5. @Override
  6. public <O extends FilterSecurityInterceptor> O postProcess(
  7. O fsi) {
  8. fsi.setSecurityMetadataSource(mySecurityMetadataSource(fsi.getSecurityMetadataSource()));
  9. return fsi;
  10. }
  11. })

1.5、 AccessDecisionManager 访问决策管理者

  1. //配置自定义 决策管理器
  2. @Override
  3. protected void configure(HttpSecurity http) throws Exception {
  4. http
  5. ...
  6. .anyRequest()
  7. .authenticated()
  8. .accessDecisionManager(accessDecisionManager());
  9. }

二、登录认证流程

  • 图示

image.png

  • 流程介绍
    • 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);

三、权限认证流程

  • 图示

image.png

  • 流程介绍
    • 1、访问需要权限的资源
    • 2、使用 FilterInvocationSecurityMetadataSource 获取当前访问资源需要的权限
    • 3、AccessDecisionManager 进行授权决策
      • 4、AccessDecisionVoter 投票决策
    • 5、决策通过,则放行访问

四、SpringSecurity + OAuth2.0 鉴权