2012-04-17 10 views
1

UPDATE(17.04.2012):私は結果として何を持っていますか。@PreAuthorizeのカスタムクラスプリンシパル

ルートのcontext.xml:

<context:annotation-config/> 
<context:component-scan base-package="com.grsnet.qvs.controller.web"/> 
<security:global-method-security pre-post-annotations="enabled" /> 
<bean id="permissionManager" class="com.grsnet.qvs.auth.PermissionManager"/> 

PermissionManager.java

package com.grsnet.qvs.auth; 

import com.grsnet.qvs.model.Benutzer; 

public class PermissionManager { 

public PermissionManager() {} 

public boolean hasPermissionU01(Object principal, Integer permissionLevel) { 
    return ((Benutzer)principal).getPermission().getU_01() >= permissionLevel; 
} 
} 

コントローラー:

@PreAuthorize("@permissionManager.hasPermissionU01(principal, 1)") 
@RequestMapping(value = "/u01", method = RequestMethod.GET) 
public String listU01(HttpServletRequest request, Map<String, Object> map) throws Exception { 
    setGridFilters(map); 
    return "u01panel";  
} 

は、私がPermissionManager.hasPermissionU01にブレークポイントを設定します。私のセキュリティ注釈は無視されたようです。

理由は何ですか?私のミスはどこですか?

ありがとうございました。 UPDATE

OF

END私はここで聞いているグーグルの時間後。 私は

  1. は、Spring MVCのアプリ
  2. CustomUserDetailService
  3. カスタムUserDetailsクラス

    public class Benutzer extends User implements UserDetails { 
    ... 
        private Permission permission = null; 
    ... 
    } 
    
  4. 権限クラス、非常に良いではありません実現していますが、私はそれを使用する必要があります。

    public class Permission { 
    ... 
        private Integer u_01 = 0; 
    ... 
    } 
    
  5. コントローラ

    @Controller 
    public class U01Controller { 
    
        @RequestMapping(value = "/u01", method = RequestMethod.GET) 
        public String listU01(HttpServletRequest request, Map<String, Object> map) throws Exception { 
    

マイタスク全体でコントローラを確保し、内部の方法を確保するためです。 私はこのようないくつか書きたいと思います:

@PreAuthorize("principal.permission.u_01>0") 
public class U01Controller { 

@RequestMapping(value = "/u01", method = RequestMethod.GET) 
@PreAuthorize("principal.permission.u_01=2") 
public String listU01(HttpServletRequest request, Map<String, Object> map) throws Exception { 

ACL、プリンシパルへのアクセスを得るためにUserDetailsインターフェースを使用しているようだが。 ACLの中に型キャストするのはおそらくですか?

@PreAuthorize("(com.grsnet.qvs.model.Benutzer)principal.permission.u_01=2") 

ありがとうございます。

答えて

4

おそらくだと思いますが(それを試しましたか?)、最良の方法はアクセス許可の決定を行う方法を知っている別のクラスを作成することです。特に、それは次のように行うことができる:

public class Decision { 
    private Decision() {} // no instance, please 

    // Type is probably a bit too wide... 
    static boolean mayList(Object principal) { 
     return ((com.grsnet.qvs.model.Benutzer)principal).permission.u_01 == 2; 
    } 

    // etc... 
} 

次に、あなたの@PreAuthorizeは次のように書くことができます:意思決定プロセスは、あなたがAを使用して入ることだろう、より複雑だった場合

@PreAuthorize("Decision.mayList(principal)") 

豆は意思決定を行うために。これは春ELあるのでその後、あなたは(あなたがdecider Beanへの委任していると仮定して)記述します

@PreAuthorize("@decider.mayList(principal)") 

(もちろん、確かに上記の私の小さなDeciderクラスがBeanではありません...)

+0

ええ、興味深い... @PreAuthorize( "Decision.mayList(principal)> 1")のようなものを書くことができますか?ありがとう。 – mad

+0

もちろん、あなたは_could_、しかし、私は複数のメソッドを持っていると思います。つまり、決定全体がこの方法に含まれます。私は、自明ではないシステムでは、ビジネス・メソッド間で少なくともいくつかの決定を再利用し、それらをある場所で正しいものにすることは保守性にとって非常に貴重なものであると確信しています。 。 –

+0

よろしいですか?私は後で試してみて、あなたの答えを受け入れるか、あなたにaddititonallyを尋ねるでしょう。ありがとう。 – mad

1

プロレンをドナルズ溶液で溶解した。 私のエラーが投稿されました

<security:global-method-security pre-post-annotations="enabled" /> 

ルートコンテキストです。

注意してservletContextに配置してください。

Donal、もう一度ありがとうございます。

関連する問題