2016-04-29 20 views
0

私はとして当局の名前を持つが含まれています。 .. ")では、hasAnyAuthority( 'ROLE_ADMIN'、 'ROLE_ADMIN_L1'、 'ROLE_ADMIN_L2'、 'ROLE_ADMIN_L3'、...)のすべての名前をリストするのではなく、SPELを使用して権限名に" ROLE_ADMIN " ?春のセキュリティ事前認証SPELは "ROLE_ADMIN"

答えて

0

を使用しています。

SPELがプリンシパルを取得できるため、解決策はprincipal.authoritiesのすべての権限をチェックし、名前が "ROLE_ADMIN"で始まる権限を検索することです。コードの断片は以下の通りである:( "?#1 principal.authorities [authority.startsWith( 'ROLE_ADMIN')]のサイズ()> 0")

@PreAuthorize パブリックオブジェクトapiName(プリンシパルプリンシパル){...}

"#principal.authorities?[authority.startsWith( 'ROLE_ADMIN')]"という表現は、すべての権限名が "ROLE_ADMIN"で始まる配列を返します。配列のサイズが0より大きい場合、ユーザーはメソッドを呼び出す権限を持ちます。

乾杯!

0

Springs hierarchical rolesを使用する方が良いと思います。そうすれば、すべてのROLE_ADMIN_L1 ...がROLE_ADMINであるように設定することができます。ドキュメント

<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter"> 
    <constructor-arg ref="roleHierarchy" /> 
</bean> 
<bean id="roleHierarchy" 
     class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl"> 
    <property name="hierarchy"> 
     <value> 
      ROLE_ADMIN > ROLE_STAFF 
      ROLE_STAFF > ROLE_USER 
      ROLE_USER > ROLE_GUEST 
     </value> 
    </property> 
</bean> 

ROLE_ADMIN ⇒ ROLE_STAFF ⇒ ROLE_USER ⇒ ROLE_GUEST

から

例ですから、このような何か必要があります:

<property name="hierarchy"> 
    <value> 
     ROLE_ADMIN_L1 > ROLE_ADMIN 
     ROLE_ADMIN_L2 > ROLE_ADMIN 
     ROLE_ADMIN_L3 > ROLE_ADMIN 
    </value> 
</property> 

を、私は道を考え出し@PreAuthroize("hasRole('ADMIN')")

+0

これは私が欲しいものではありません。 ROLE_ADMINにはグローバル権限があります。 ROLE_ADMIN_XXXには、ROLE_ADMINが呼び出せるAPIのサブセットがあります。私は@PreAuthroize( "hasAnyAuthority( ''))アノテーションの簡単な解決策を探しています。 –

+0

注釈にROLE_ADMIN_XXXの番号を記載するのではなく、AFAIKは春の組み込みツールでは不可能です。 'hasAnyAuthority' [here] [https://github.com/spring-projects/spring-security/blob/ce20cfcb9803a6175f6befc9008cadcc4e3b6d72/core/src/main/java/org/springframework/security/access/expression/SecurityExpressionRootの実装です。 java]では、一連のロールで単純なcontainsを実行します。 –

関連する問題