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のドキュメントを見てきましたが、何も見つかりませんでした。
しかし、これで問題は解決しません。 'MappableAttributesRetriever'または' WebXmlMappableAttributesRetriever'は、それがデータベースかどこから来ても、マッピング可能なすべてのロールのリストを必要とします。私はそれが何であるかにかかわらず、リクエスト内のすべての役割を説明したい。私たちの他のアプリケーションでは、Tomcat 'server.xml'の''タグに 'allRolesMode'属性を指定することでこれが実現すると思います。 –
これは不可能ですが、['HttpServletRequest'](http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html)にはロールを取得する方法がありません。その理由は、 Spring Securityにそのようなマッピングが必要な理由特定のロールが利用可能である場合にのみ、 'HttpServletRequest.isUserInRole'で尋ねることが可能です。あなたが 'HttpServletRequest'からすべての役割を得る方法を見つけたら、あなた自身の' MappableAttributesRetriever'でこの方法を使うことができます。 – dur