4

管理者 (ロール ROLE_ADMIN を持つユーザー) がすべての式で明示的に言及せずにすべてにアクセスできるようにするにはどうすればよいですか? 現在、コントローラーのメソッドに次のように注釈を付けています

@PreAuthorize("(hasRole('ROLE_VENDOR') and hasPermission(#product, 'admin')) or hasRole('ROLE_ADMIN')")

しかし、管理者が何でもできるようにしながら、このようにシンプルにしたい:

@PreAuthorize("hasRole('ROLE_VENDOR') and hasPermission(#product, 'admin')")

出来ますか?それ、どうやったら出来るの?管理者の hasPermission(#product, ...) は false と評価されることに注意してください。

4

3 に答える 3

2

階層的な役割を使用します。

一般的な構成は次のとおりです。

<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>

参照

編集

おそらく、カスタムのPermissionEvaluatorも作成する必要があります。まだ持っていない場合: AclPermissionEvaluatorを拡張し、ユーザーがロールを取得するとhasPermissionすぐに true を返すようにのみ上書きします。adminそれ以外の場合は戻りますsuper.hasPermission(...)

次のように Bean を構成します。

<security:global-method-security pre-post-annotations="enabled">
     <security:expression-handler ref="expressionHandler" />
</security:global-method-security>

<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
   <property name="permissionEvaluator" ref="customPermissionEvaluator" />
   ... 
</bean>
于 2013-10-01T20:04:55.057 に答える
1

管理者に必要なすべてのロールを付与するか、ここで説明されているように階層ロールを使用します。

于 2013-10-01T19:56:24.450 に答える
1

これを security-config で試してください

<http use-expressions="true">
    // your security patterns
    <intercept-url pattern="/**" access="hasRole('admin')" />

</http>

このパターンをリストの最後に配置すると、すべてのルールをチェックし、最後のパターンに一致しない場合、スプリングはadmin実際には任意のコントローラーに等しい任意のアドレスでリクエストの送信を許可します

于 2013-10-01T19:58:13.617 に答える