2011-09-20 9 views
11

私は現在、新しいWebアプリケーションスタックにsprings-securityを統合しています。特定のオブジェクトまたは特定の種類のすべてのオブジェクトにアクセスするためのユーザーまたはロールのアクセス許可を付与する必要があります。しかし、それは私が実際にドキュメントや例を調べるときに得られなかったことの1つです:spring-security ACLによるアクセス権の付与方法

ACLは、単一のオブジェクトのユーザ/ロールに対してのみ許可を与えますか?私が理解しているように、domain objectは型を意味しますが、例とチュートリアルは特定のオブジェクトにアクセス権を割り当てるようです。私はちょうど混乱しているのですか?そうでない場合は、どうすれば他のことができますか?

ありがとうございます!

答えて

24

春のセキュリティでは、両方を行うことができます。これは、春のセキュリティがいわゆる許可ルールをサポートしているためです。春のセキュリティの用語では、のアクセス許可の評価者と呼ばれています。パーミッションルールにはACLが含まれていますが、特定の状態になっているオブジェクトのインスタンスを保護することもできます。

これは、それがどのように動作するかです:

  1. あなたはPermissionEvaluatorを拡張する必要がある - これはあなたがアクセス権を決定するためのスーパーカスタムロジックを持つことができます - あなたがオブジェクトの種類を確認したり、特定のを確認することができますID、またはメソッドを呼び出し、ユーザーがオブジェクトを作成したユーザーであるかどうかを確認、等:

    public class SomePermissionsEvaluator implements PermissionEvaluator { 
        @Override 
        public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) { 
         if (permission.equals("do_something") && 
         /*authentication authorities has the role A*/) { 
          return true 
         } else if (permission.equals("do_something_else") && 
         /*authentication authorities has the role B*/) { 
          return /*true if targetDomainObject satisfies certain condition*/; 
         } 
    
         return false; 
        } 
    
        @Override 
        public boolean hasPermission(Authentication authentication, 
         Serializable targetId, String targetType, Object permission) { 
        throw new UnsupportedOperationException(); 
        } 
    } 
    
  2. 今、あなたはセキュリティルールを持っていることを、あなたは注釈を通してそれを適用する必要があります。

    @PreAuthorize("hasRole('SOME_ROLE_OR_RIGHT') and" + 
    " hasPermission(#someDomainObject, 'do_something')") 
    public void updateSomeDomainObject(SomeDomainObject someDomainObject) { 
        // before updating the object spring-security will check the security rules 
    } 
    
  3. これはセキュリティアノテーションは、applicationContext.xmlをで有効にする必要があります動作させるためには:

    <global-method-security secured-annotations="enabled" pre-post-annotations="enabled"> 
        <expression-handler ref="expressionHandler"/> 
    </global-method-security> 
    
    <beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
        <beans:property name="permissionEvaluator"> 
         <beans:bean id="permissionEvaluator" class="com.npacemo.permissions.SomePermissionsEvaluator"/> 
        </beans:property> 
    </beans:bean> 
    
+0

ああ、迅速な答えのためのおかげで、それは思いませんでした'AclPermissionEvaluator'実装で' ObjectIdentityRetrievalStrategy'を使用するPermissionEvaluatorを簡単に実装することができます... – Pete

+0

リストとコードの両方をハイライト表示でき、余分なスペースを4つ追加できます。この記事を例として編集しました。ソースを参照してください。 :) –

+0

私は今参照してください。どうもありがとう! –

関連する問題