web-dev-qa-db-ja.com

spring-security-oauth2 @ EnableAuthorizationServerを理解する

spring-security-oauth2プロジェクトが承認サーバーとしてのクラスでスムーズに実行されています。

client-ids、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");
    }
}

Configureメソッドが何をしているのかわからないことを除いて、すべてが正常に機能しています。完全なメソッドを削除しても、oauth2プロセスは正常に機能します。

このコンテキストでのconfigureメソッドの主な用途は何ですか?また、ここで設定されている領域は何ですか?

それを理解するのを手伝ってください。

ありがとう。

6
Abdullah Khan
  1. configureメソッドの目的

AuthorizationServerConfigurerAdapterには3つのconfigure(...)メソッドがあり、3つすべてをオーバーライドでき、それらは異なる目的を果たします。

あなたの質問では、1つだけ引用しました。

それらの目的は、承認サーバーのエンドポイント、クライアント、およびセキュリティのカスタム設定を提供することです。したがって、いくつかの事前定義されたデフォルト設定があるので、オーバーライドしたい数はあなた次第です。

@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

Javadocの説明は、前の回答ですでに提供されています。

素人の言語では、これはトークン生成エンドポイントを設定することです。つまり、プロパティを指定する場合はsecurity.oauth2.client.client-idおよびsecurity.oauth2.client.client-secret、Springは認証サーバーを提供し、エンドポイントで標準のOauth2トークンを提供します/oauth/token

実際のシナリオでは、これが意味するのは、エンタープライズユーザーLDAPまたはユーザーデータベースの上にトークン生成Webアプリケーション(レイヤー7)をセットアップし、通常はコンシューマー側アプリ(APIなど)とは別のアプリケーションであるということです。

9
Sabir Khan

@ EnableAuthorizationServer のJavaDocコメントを見ると、次のようになっていることがわかります。

承認サーバーを有効にするための便利なアノテーション(つまり、現在のアプリケーションコンテキストのAuthorizationEndpointとTokenEndpoint。これはDispatcherServletコンテキストである必要があります。サーバーの多くの機能は、AuthorizationServerConfigurerタイプの@Beansを使用してカスタマイズできます(たとえば、AuthorizationServerConfigurerAdapterを拡張します。ユーザーは通常のSpringSecurity機能(EnableWebSecurity @EnableWebSecurityなど)を使用して承認エンドポイント(/ oauth/authorize)を保護する責任がありますが、トークンエンドポイント(/ oauth/token)は、クライアントの資格情報でHTTPBasic認証を使用して自動的に保護されます。 1つ以上のAuthorizationServerConfigurersを介してClientDetailsS​​erviceを提供することによって登録されます。

AuthorizationServerConfigurerAdapterの拡張は、承認サーバーのカスタマイズにのみ使用されます。 Beanクラスに@EnableAuthorizationServerアノテーションを付けるだけで、SpringSecurity内で機能するAuthorizationServerを簡単にセットアップできます。

1
shazin