了解spring-security-oauth2 @EnableAuthorizationServer

时间:2017-10-11 14:36:19

标签: java spring-boot spring-security-oauth2

我有一个 spring-security-oauth2 项目,该项目作为授权服务器顺利运行。

client-id,user-tokens,refresh-tokens 都由数据库管理。

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
    private static String REALM = "MY_OAUTH_REALM";
    ...
    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.realm(REALM + "/client");
    }
}

一切正常,但我不知道配置方法在做什么。即使我删除了完整的方法, oauth2 进程仍然可以正常工作。

在这种情况下,configure方法的主要用途是什么?这里设置的是什么领域?

请帮助我理解它。

感谢。

2 个答案:

答案 0 :(得分:5)

  1. configure方法的目的

  2. AuthorizationServerConfigurerAdapter有三种configure(...)方法,这三种方法都可以被覆盖,并且这些方法有不同的用途。

    在你的问题中,你只引用了一个。

    他们的目的是为Authorization Server端点,客户端和客户端提供自定义设置。安全。因此,由于存在一些预定义的默认设置,因此您需要覆盖多少。

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
    // This can be used to configure security of your authorization server itself 
    // i.e. which user can generate tokens , changing default realm etc.
    // Sample code below.
    
    // We're allowing access to the token only for clients with  'ROLE_TRUSTED_CLIENT' authority.
    // There are few more configurations and changing default realm is one of those 
        oauthServer
            .tokenKeyAccess("hasAuthority('ROLE_TRUSTED_CLIENT')")
            .checkTokenAccess("hasAuthority('ROLE_TRUSTED_CLIENT')");
    }
    
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    // Here you will specify about `ClientDetailsService` 
    // i.e. information about OAuth2 clients & where their info is located - memory , DB , LDAP etc.
    // Sample code below.
    }
    
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
    // This can be used to configure security of your authorization server itself
    // i.e. which user can generate tokens , changing default realm etc - Sample code below.
    
        // we're allowing access to the token only for clients with  'ROLE_TRUSTED_CLIENT' authority.
        // There are few more configurations and changing default realm is one of those 
        oauthServer
            .tokenKeyAccess("hasAuthority('ROLE_TRUSTED_CLIENT')")
            .checkTokenAccess("hasAuthority('ROLE_TRUSTED_CLIENT')");
    }
    
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        // Here you will specify about `ClientDetailsService` i.e.
        // information about OAuth2 clients & where their info is located - memory , DB , LDAP etc.
        // Sample code below 
        clients.inMemory()
            .withClient("trusted-app")
            .authorizedGrantTypes("client_credentials", "password", "refresh_token")
            .authorities("ROLE_TRUSTED_CLIENT")
            .scopes("read", "write")
            .resourceIds("oauth2_id")
            .accessTokenValiditySeconds(10000)
            .refreshTokenValiditySeconds(20000)
            .secret("secret");
    }
    
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        // Here you will do non-security configs for end points associated with your Authorization Server
        // and can specify details about authentication manager, token generation etc. Sample code below 
        endpoints
            .authenticationManager(this.authenticationManager)
            .tokenServices(tokenServices())
            .tokenStore(tokenStore())
            .accessTokenConverter(accessTokenConverter());
    }
    
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }   
    
    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("abcd");
        return converter;
    }
    
    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        defaultTokenServices.setSupportRefreshToken(true);
        defaultTokenServices.setTokenEnhancer(accessTokenConverter());
        return defaultTokenServices;
    }
    
    1. @EnableAuthorizationServer

    2. 的目的

      在上一个答案中已经提供了javadoc解释。

      在外行人的语言中,这是设置你的令牌生成终点,即 如果您提供属性security.oauth2.client.client-idsecurity.oauth2.client.client-secret,Spring将为您提供身份验证服务器,在端点/oauth/token提供标准Oauth2令牌

      在实际情况中,这意味着您在企业用户LDAP或用户数据库之上设置令牌生成Web应用程序(第7层),并且通常是与客户端应用程序(API)分开的应用程序等)。

答案 1 :(得分:1)

如果您查看@EnableAuthorizationServer的JavaDoc评论,可以看到它说明了以下内容;

  

启用授权服务器的便捷注释(即   AuthorizationEndpoint和当前应用程序中的TokenEndpoint   context,必须是DispatcherServlet上下文。许多功能   可以使用@Beans类型自定义服务器   AuthorizationServerConfigurer(例如通过扩展   AuthorizationServerConfigurerAdapter。用户负责   使用正常保护授权端点(/ oauth / authorize)   Spring Security功能(EnableWebSecurity @EnableWebSecurity   等),但令牌端点(/ oauth / token)将自动进行   使用客户端凭据上的HTTP基本身份验证进行保护。   必须通过提供ClientDetailsS​​ervice来注册客户端   一个或多个AuthorizationServerConfigurers。

扩展AuthorizationServerConfigurerAdapter仅用于自定义授权服务器。通过使用@EnableAuthorizationServer

简单注释Bean类,您可以在Spring Security中轻松设置功能正常的授权服务器