更新(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")


提前致谢。

最佳答案

虽然我认为您可能可以做到这一点(您只是尝试了吗?)在我看来,最好的方法是创建另一个知道如何进行权限决策的类。特别是,可以这样完成:

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,所以您要编写(假设您委托给decider bean):

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


(当然,我上面的Decider小类绝对不是bean…)

关于java - @PreAuthorize中的自定义类主体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10185400/

10-09 20:00