2016-10-13 10 views
3

Tomcatアプリケーションサーバー上で実行され、サードパーティのIdPに対して認証されるSpringブートWebアプリケーションがあります。Spring Security - mappableAuthoritiesで指定されていない限り、HttpServletRequestでロールにアクセスできない

私たちは現在、<security-role><security-constraint>web.xmlに使用している多くのアプリで役割ベースの認証を行い、正常に動作します。

は今、春のセキュリティを使用しようとすると、私は次の設定クラスを追加しました:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     String[] publicPaths = /*get public paths from properties*/ 
     String[] authorizedPaths = /*get authorized paths from properties*/ 
     String[] authorizedRoles = /*get authorized roles from properties*/ 

     http.csrf().disable() 
       .jee() 
       .mappableAuthorities(authorizedRoles) 
       .and() 
       .authorizeRequests() 
       .antMatchers(publicPaths).permitAll() 
       .antMatchers(authorizedPaths).hasAnyRole(authorizedRoles) 
       .and() 
       .logout().disable() 
     ; 
    } 

} 

上記の設定でauthorizedRolesは、このアプリケーションにアクセスすることを許可されたロールです。しかし、他にもHttpServletRequest.isUserInRole()と呼ばれる手動チェックがあり、ユーザーが特定の役割を持っているかどうかを判断できます。 Spring Securityを使用する前に、そのユーザーが元の要求でその役割を持っていた場合、その呼び出しはtrueを返します。 Springブートを追加した後、その呼び出しは、上記の例で.mappableAuthorities()に渡されたロールの1つである場合、trueを返します。 HttpServletRequest.isUserInRole()で確認されるロールはデータベースに格納され、頻繁に更新される可能性があるため、アプリケーションがロードされたときに.mappableAuthorities()に渡すことは不可能です。

だから、私の質問のポイントを得るために、それは春のセキュリティは、元HttpServletRequestを変更し、.mappableAuthorities()に渡さauthorizedRolesに含まれていない任意の役割を取っているように思えます。

この動作を回避する方法、または.mappableAuthorities()に何らかのワイルドカードを渡す方法はありますか。HttpServletRequest.isUserInRole()を呼び出すことでアクセスできるようにするには、アプリケーションの起動時にすべての役割を知る必要はありませんか?私は何時間もSpring Securityのドキュメントを見てきましたが、何も見つかりませんでした。

答えて

3

SecurityContextHolderAwareRequestFilterHttpServletRequestをラップので、あなたは、のみマッピングされた役割を見ることができます:

サーブレットAPIセキュリティメソッドを実装し、要求ラッパーとのServletRequestに移入フィルター。

    :サーブレットAPIセキュリティメソッドを実装するために SecurityContext -defined Authenticationオブジェクトを使用しています

    A春のセキュリティを意識したHttpServletRequestWrapper、:

    これは、サーブレットAPIセキュリティメソッドを実装するためにSecurityContextHolderAwareRequestWrapperを使用しています

  • isUserInRole(String)
  • HttpServletRequestWrapper.getRemoteUser()GrantedAuthority Sへ(HttpServletRequest.isUserInRole(String)を呼び出すことによって得られるような)ユーザーのJ2EEの役割を変換AuthenticationDetailsS​​ourceの

    実装と詳細オブジェクトの認証にこれらを格納:役割のマッピングをカスタマイズするには

J2eeBasedPreAuthenticatedWebAuthenticationDetailsSourceを参照してください。

それは、マッピング可能な役割を取得するためにMappableAttributesRetrieverを使用しています。

マッピング可能なセキュリティ属性文字列のリストを取得できるクラスによって実装されるインタフェース(例えばAで利用可能なすべてのJ2EEロールのリストWebアプリケーションまたはEJBアプリケーション)。

MappableAttributesRetrieverあなたのデータベースからマッピング可能な役割をロードする独自の方法を書くことができます。

それともweb.xmlから役割を取得WebXmlMappableAttributesRetrieverを、使用することができます。

このMappableAttributesRetriever実装では、web.xmlファイルから定義されたJ2EEロールのリストを読み込み、getMappableAttributes()からこれらを返します。

+1

しかし、これで問題は解決しません。 'MappableAttributesRetriever'または' WebXmlMappableAttributesRetriever'は、それがデータベースかどこから来ても、マッピング可能なすべてのロールのリストを必要とします。私はそれが何であるかにかかわらず、リクエスト内のすべての役割を説明したい。私たちの他のアプリケーションでは、Tomcat 'server.xml'の' 'タグに 'allRolesMode'属性を指定することでこれが実現すると思います。 –

+0

これは不可能ですが、['HttpServletRequest'](http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html)にはロールを取得する方法がありません。その理由は、 Spring Securityにそのようなマッピングが必要な理由特定のロールが利用可能である場合にのみ、 'HttpServletRequest.isUserInRole'で尋ねることが可能です。あなたが 'HttpServletRequest'からすべての役割を得る方法を見つけたら、あなた自身の' MappableAttributesRetriever'でこの方法を使うことができます。 – dur

関連する問題