1

マイクロサービスシステムを構築するためにSpring BootとSpring Cloudを適用するだけです。私はSpring Oauthもそれに適用します。正直なところ、すべてが完璧です。春は素晴らしい仕事をしています。 このシステムでは、JDBCデータソースを使用してOAuthサーバーの仕事を行い、UserDetails権限(1人のユーザーには複数の権限があります)に基づく権限を使用するマイクロサービスプロジェクトがあります。いくつかのマイクロサービスプロジェクトがリソースサーバの仕事をしています(Jerseyを使ってRest APIを公開しています)、アクセスセキュリティはOAuthベアラトークンの認証の許可に基づいています。Spring OAuth - リソースのリロードリソースのIDと認証の権限

リソースサーバーのOAuth設定クラスすべてが素晴らしいです。この

@Configuration 
@EnableResourceServer 
public class ResourceServerConfig extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 

     http.sessionManagement() 
      .sessionCreationPolicy(SessionCreationPolicy.STATELESS); 
     http.csrf().disable(); 

     http.authorizeRequests()      
      .antMatchers("/restservice/object/list") 
      .hasAuthority("PERMISSION_VIEW_OBJECT_LIST"); 

     //  ... 
    } 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) 
       throws Exception { 
     resources.resourceId("abc-resource-id") 
       .tokenStore(new JdbcTokenStore(dataSource())); 
    } 

    @Bean 
    @ConfigurationProperties(prefix = "oauth2.datasource") 
    public DataSource dataSource() { 
     return DataSourceBuilder.create().build(); 
    } 
} 

のようなものです!私は新しいRESOURCEIDとして新しいmicroserviceプロジェクトを追加し、私はOAuthのクライアントのテーブルOAUTH_CLIENT_DETAILSにRESOURCE_IDSにRESOURCEID値を追加する場合は、すべての要求は、新しいリソースサービスリターンのAPIを休ませる

  1. :しかし、私は2問題が発生しましたこのようなエラーが発生しました {"error": "access_denied"、 "error_description": "無効なトークンにはリソースID(xyz-resource-id)が含まれていません"} これは、ユーザーがログアウトして新しいアクセス権を取得するトークン。それは私がAccessトークンとRefresh token intテーブルOAUTH_ACCESS_TOKENとOAUTH_REFRESH_TOKENのレコードをデータベースに削除する場合にのみ有効です。

  2. 実行時にアクセス権が変更された場合、認証の権限が再ロードされないため、権限が変更される前にテーブルOAUTH_ACCESS_TOKENのアクセストークンのAUTHENTICATION値に古い権限が含まれています。この場合、変更された権限で新しいアクセストークンを取得するには、ログアウトして再ログインする必要があります。

この2つの問題を解決する方法はありますか? 私はSpring Cloud Brixton.SR4とSpring Boot 1.3.5.RELEASEを使用しています。

答えて

1

デフォルトのSpring JdbcTokenStoreを使用している場合、ユーザー認証はシリアル化され、ユーザーが初めてトークンを認証して取得するときにアクセス/更新トークンとともに格納されます。

トークンを使用して認証するたびに、この格納された認証がロードされるため、ユーザーのアクセス許可の変更や余分なリソースの追加はユーザーのアクセス許可に反映されません。

これにいくつかのチェックを追加するには、DefaultTokenServicesを拡張し、loadAuthentication(String accessTokenValue)メソッドをオーバーライドして、ユーザー認証がトークンストアからロードされると独自のチェックを実行できます。

これはこれを行う理想的な方法ではないかもしれませんが、これまでに行ったことがわかりました。 DefaultTokenServicesを上書きする

は、あなたにAuthorizationServerConfigurerAdapter Configクラスをfollwoing Beanメソッドを追加します。

class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 
    @Bean 
    public AuthorizationServerTokenServices authorizationServerTokenServices() throws Exception { 
     // Where YourTokenServices extends DefaultTokenServices 
     YourTokenServices tokenServices = new YourTokenServices(); 
     tokenServices.setTokenStore(tokenStore); 
     tokenServices.setClientDetailsService(clientDetailsService); 
     return tokenServices; 
    } 
} 
+0

ありがとうございました。あなたは、リソースサーバーまたはOAuthサーバーでDefaultTokenServicesを拡張することを意味しますか?私のばかげて申し訳ありません、どのようにカスタムTokenServicesクラスを注入するように設定できますか? –

+0

認証サーバーでは、ユーザーの詳細の読み込みを行う部分と同じです。私は私の答えに実装を追加しました –

+0

ありがとう、私はそれを試してみます。 –

0

私はこの方法でリロードの問題を解決しました。

@Bean 
public ClientDetailsService jdbcClientDetailsService() { 
    return new JdbcClientDetailsService(dataSource); 
} 
関連する問題