Spring Security OAuth专题学习-授权服务源码解读

授权服务主要完成以下四个核心功能:

  • 客户端授权关系管理;
  • 接收用户或客户端登录请求,生成accessToken
  • Token存储
  • Token校验

本文将从源码层面分析授权服务如何实现上述四个功能。
关于Spring Oauth2的一些基础概念及示例,可参考:http://liumoran.cn/topic/myTopics/1

1. 概述

授权服务包含有以下几个关键类:

  • EnableAuthorizationServer
    启用授权服务,并引入AuthorizationServerEndpointsConfiguration及AuthorizationServerSecurityConfiguration两个配置类;
  • AuthorizationServerEndpointsConfiguration/AuthorizationServerEndpointsConfigurer
    授权服务Endpoints配置类;
  • AuthorizationServerSecurityConfiguration/AuthorizationServerSecurityConfigurer
    授权服务访问授权配置类;
  • AuthorizationServerConfigurerAdapter(AuthorizationServerConfigurer)
    授权服务配置适配器,开发人员可定义其实现类来完成对授权服务的各项配置;
  • ClientDetailsServiceConfigurer
    客户端配置类;

其中比较费解的是AuthorizationServerEndpointsConfiguration/AuthorizationServerEndpointsConfigurer
与AuthorizationServerSecurityConfiguration/AuthorizationServerSecurityConfigurer。
简单来说Configuration类可以看成是Configurer的代理类和配置类;而Configurer是存储配置项的类。

这几个类之间的关系如下所示:

1558323393708.png

2. AuthorizationServerEndpointsConfiguration

它完成以下功能:

  • 配置AuthorizationServerEndpointsConfigurer:通过init方法完成AuthorizationServerEndpointsConfigurer的创建与配置。
  • 创建Endpoint:通过Bean注解,往Spring容器中托管各个Endpoint(如用于处理/oauth/token请求的TokenEndpoint、用于处理/oauth/authorize请求的AuthorizationEndpoint等;
    Endpoint可以看成是控制器,即平常我们所定义的Controller。

2.1 AuthorizationServerEndpointsConfigurer的创建与配置

init方法定义如下:

@Autowired
private List<AuthorizationServerConfigurer> configurers = Collections.emptyList();

@PostConstruct
public void init() {
   
    for (AuthorizationServerConfigurer configurer : configurers) {
   
        try {
   
            configurer.configure(endpoints);
        } catch (Exception e) {
   
            throw new IllegalStateException("Cannot configure enpdoints", e);
        }
    }
    endpoints.setClientDetailsService(clientDetailsService);
}

看到它就是使用容器中的所有类型为AuthorizationServerConfigurer的Bean,然后调用其configure方法对endpoints进行配置。
因此如果我们在应用中定义了实现AuthorizationServerConfigurer接口或者继承AuthorizationServerConfigurerAdapter的配置类,
并且这个配置类通过Configuration注解或者其它方式被注入到Spring中,那么我们在方法configure(AuthorizationServerEndpointsConfigurer)中
定义的代码将会被执行。
通过这种方式我们可以对授权服务所使用的TokenStore、TokenService等进行配置,见4.3节内容。具体配置项内容可看AuthorizationServerEndpointsConfigurer源码。

2.2 创建Endpoints

AuthorizationServerEndpointsConfiguration通过Bean往Spring容器中注入了多个Endpoint,用于处理OAuth相关的授权请求。主要包含的Endpoint如下:

  • AuthorizationEndpoint: 用于处理资源授权请求(/oauth/authorize)
  • TokenEndpoint: 用于处理Token申请请求(/oauth/token)
  • CheckTokenEndpoint:用于处理Token校验请求(/oauth/check_token)
  • 其它:默认的授权页面等Endpoint;

以TokenEndpoint为例,它的托管过程如下:

@Bean
public TokenEndpoint tokenEndpoint() throws Exception {
   
    TokenEndpoint tokenEndpoint = new TokenEndpoint();
    tokenEndpoint.setClientDetailsService(clientDetailsService);
    tokenEndpoint.setProviderExceptionHandler(exceptionTranslator());
    tokenEndpoint.setTokenGranter(tokenGranter());
    tokenEndpoint.setOAuth2RequestFactory(oauth2RequestFactory());
    tokenEndpoint.setOAuth2RequestValidator(oauth2RequestValidator());
    tokenEndpoint.setAllowedRequestMethods(allowedTokenEndpointRequestMethods());
    return tokenEndpoint;
}

TokenEndpoint的关键方法如下:

@RequestMapping(value = "/oauth/token", method=RequestMethod.POST)
public ResponseEntity<OAuth2AccessToken> postAccessToken(Principal principal
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security OAuth2 是 Spring Security 的子项目,用于支持 OAuth2 协议。其源码包括了授权服务器和资源服务器两部分,下面分别介绍。 ## 授权服务源码 Spring Security OAuth2 的授权服务源码主要包括以下几个模块: 1. oauth2-core:包括 OAuth2 协议的核心实现,如授权码、令牌等的生成和验证。 2. oauth2-jwt:包括 JWT 令牌的生成和解析。 3. oauth2-authorization-server:包括授权服务器的实现,包括授权码模式、密码模式、客户端模式等。 其中,授权服务器的实现是基于 Spring MVC 的,主要包括以下几个核心类: 1. AuthorizationEndpoint:处理授权端点,包括授权码模式、密码模式、客户端模式等。 2. TokenEndpoint:处理令牌端点,包括颁发访问令牌、刷新令牌等。 3. WhitelabelApprovalEndpoint:处理用户授权页面,提供用户授权功能。 ## 资源服务源码 Spring Security OAuth2 的资源服务源码主要包括以下几个模块: 1. oauth2-resource:包括资源服务器的核心实现,如令牌解析和访问控制等。 2. oauth2-jwt:包括 JWT 令牌的生成和解析。 其中,资源服务器的实现是基于 Spring Security 的,主要包括以下几个核心类: 1. ResourceServerConfigurerAdapter:用于配置资源服务器,包括资源的访问控制、令牌的解析等。 2. JwtAccessTokenConverter:用于将 JWT 令牌转换为 OAuth2 令牌。 以上是 Spring Security OAuth2 的授权服务器和资源服务器的主要源码模块和类,具体实现方式还需要根据实际需求进行具体的配置和实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值