2

更新 (17.04.2012):結果として私が持っているもの。

root-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 にブレークポイントを設定しました。私のセキュリティ注釈が無視されたようです。

理由は何ですか?私の間違いはどこですか?

ありがとう。

更新の終了

何時間もグーグルで調べた後、ここで尋ねなければなりません。私は持っている

  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

2 に答える 2

5

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

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ように書くことができます。

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

意思決定プロセスがより複雑な場合は、Beanを使用して意思決定を行うことになります。次に、これはSpring ELであるため、次のように記述します(deciderBeanに委任していると仮定します)。

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

(もちろん、Decider上記の私の小さなクラスは間違いなくBeanではありません…)

于 2012-04-17T05:35:46.757 に答える
1

問題は Donal のソリューションで解決されました。私のエラーは私が置いたものでした

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

ルートコンテキストで。

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

ドナル、ありがとう。

于 2012-04-17T19:09:57.790 に答える