SpringSecurity Oauth2

1.认证流程

  1. ClientCredentialsTokenEndpointFilter.attemptAuthentication(...):把请求传过来客户端账号和密码封装成UsernamePasswordAuthenticationToken对象

  1. DaoAuthenticationProvider.retrieveUser(...):返回客户端信息

  1. JdbcClientDetailsService.loadClientByClientId(...):查找客户端信息

  2. TokenEndpoint.getAccessToken(...):请求token

  3. TokenGranter.grant(...) :调用认证获取token

    • AbstractTokenGranter.getOAuth2Authentication(...)

    • authenticationManager.authenticate(userAuth):authenticationManager的默认实现类ProviderManager,也就是相当于调用ProviderManager.authenticate(...)方法

    • 通过调用provider的supports方法,选出具体的provide,再调用authenticate(...)方法

       for (AuthenticationProvider provider : getProviders()) {
        if (!provider.supports(toTest)) {
        continue;
        }
        ...
        result = provider.authenticate(authentication);
       }

       

 

2.AuthorizationServerConfigurerAdapter 关键配置类

  /**
  * 认证服务配置
  *
  * @author Mr.zhou 2022/3/15
  **/
  @Configuration
  @EnableAuthorizationServer
  public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
 
      @Override
      public void configure(AuthorizationServerSecurityConfigurer security) {
          security
                  .tokenKeyAccess("permitAll()")
                  .checkTokenAccess("isAuthenticated()")
                  .allowFormAuthenticationForClients();
      }
 
      @Override
      public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
      }
 
      @Override
      public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
      }
     
  }
  1. 配置AuthorizationServer安全认证的相关信息,创建ClientCredentialsTokenEndpointFilter核心过滤器

  2. 配置OAuth2的客户端相关信息

  3. 配置AuthorizationServerEndpointsConfigurer众多相关类,包括配置身份认证器,配置认证方式,TokenStore,TokenGranter,OAuth2RequestFactory

 

 

3.顶级身份管理者AuthenticationManager(掌握)

用来从请求中获取client_id,client_secret,组装成一个UsernamePasswordAuthenticationToken作为身份标识,使用容器中的顶级身份管理器AuthenticationManager去进行身份认证(AuthenticationManager的实现类一般是ProviderManager。而ProviderManager内部维护了一个List,真正的身份认证是由一系列AuthenticationProvider去完成。而AuthenticationProvider的常用实现类则是DaoAuthenticationProvider,DaoAuthenticationProvider内部又聚合了一个UserDetailsService接口,UserDetailsService才是获取用户详细信息的最终接口,而我们上一篇文章中在内存中配置用户,就是使用了UserDetailsService的一个实现类InMemoryUserDetailsManager)。UML类图可以大概理解下这些类的关系,省略了授权部分。

posted @   有梦想的程序员。  阅读(187)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示