更新 (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 にブレークポイントを設定しました。私のセキュリティ注釈が無視されたようです。
理由は何ですか?私の間違いはどこですか?
ありがとう。
更新の終了
何時間もグーグルで調べた後、ここで尋ねなければなりません。私は持っている
- Spring MVC アプリ
- CustomUserDetailService
カスタム UserDetails クラス
public class Benutzer extends User implements UserDetails { ... private Permission permission = null; ... }
アクセス許可クラス、あまりよくわかりませんが、使用する必要があります。
public class Permission { ... private Integer u_01 = 0; ... }
コントローラ
@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")
前もって感謝します。