2012-03-21 4 views
0

私はSpring Securityの初心者です。私は、オブジェクトの属性の値に基づいて許可を与えるかどうかを決定するカスタムの投票者を作成する作業を行っています。つまり、オブジェクトインスタンスAの値XがXの属性Xを持つ場合、ROLE_MGRを持つユーザーはアクセス権を持ちます。オブジェクトインスタンスBがX属性に値jを持つ場合、ROLE_MGRにはアクセス権がありません。そうすることが可能かどうか、もしそうなら、私は何をする必要がありますか?これが不可能な場合は、Spring Securityを使用しないことにします。オブジェクトの属性値を使用してアクセスを決定することはできますか?

+0

はい、それはですが、あなたはそれを実装するには、正確にどのような問題を持っていますか?これはかなりまっすぐに見えます。 – Simeon

+0

私はカスタム投票者(AccessDecisionVoterを実装しています)を使用していましたが、ドメインオブジェクトを取得する方法はありません。どのようにカスタムの投票者のドメインオブジェクトの属性値をチェックすることができますか、カスタマイズするために別のインタフェース/クラスを調べる必要はありますか? – chanakya2

+0

「オブジェクト」についてもう少し説明する必要があると思います。それはどこにあり、あなたはどのインスタンスにアクセスするのですか?それは本質的に答えがどこにあるのかと思われます。有権者からアクセスできない場合(DAOを注入するなど)、その理由を説明する必要があります。 –

答えて

0

私はそれを理解しました。カスタムの権限評価ツールを使用する必要があります。私のコードからの抜粋は、類似した何かをしようとしているかもしれない人のための下に提供されています

のsecurity.xml

<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"> 
     <bean id="permissionEvaluator" 
      class="org.krams.tutorial.infrastructure.SomePermissionsEvaluator" /> 
    </property> 
</bean> 

サービスインタフェース @PostFilter( "hasPermission(filterObject、 'READ')") public List getAll();

カスタム権限の評価者

@Override 
public boolean hasPermission(Authentication authorities, 
     Object targetDomainObject, Object permission) { 

    boolean Decision = false; 
    System.out.println("Initial Decision: " + Decision); 

    Date cutoffDate = null; 
    try { 
     cutoffDate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH) 
       .parse("January 1, 2012"); 
     System.out.println("Cutoff Date: " + cutoffDate.toString()); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    System.out.println("Domain Object Date: " 
      + Post.class.cast(targetDomainObject).getDate()); 

    if (Post.class.cast(targetDomainObject).getDate().before(cutoffDate)) { 
     Decision = false; 
     System.out.println("In before"); 
    } else { 
     Decision = true; 
     System.out.println("In after"); 
    } 
    System.out.println("Final Decision: " + Decision); 
    System.out.println("--------"); 
    return Decision; 
} 
0

これは可能ですが、まずSpring Securitysドメインオブジェクトセキュリティを見てください。これは、あなたのオブジェクトにきめ細かなアクセスを許可するために使用されます。http://static.springsource.org/spring-security/site/docs/3.0.x/reference/domain-acls.html

+1

私はすでにaclのドキュメントを読んできましたが、ドメインオブジェクトの属性の値に基づいてどのように決定できるかは指定されていません。 – chanakya2

+0

私は同意します、OPは、ドメインオブジェクトのプロパティ自体の値ではなく、ドメインオブジェクトのプロパティの値に基づいて保護します。 –

関連する問題