Java @PreAuthorize中的自定义类主体

Java @PreAuthorize中的自定义类主体,java,spring-security,Java,Spring Security,更新(2012年4月17日):所以我得到了结果 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="permissi

更新(2012年4月17日):所以我得到了结果

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"/>
控制器:

@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";      
}
  • 权限类,不是很好实现,但是我已经用过了

    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 {
    
    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("Decision.mayList(principal)")
    
    然后您的
    @PreAuthorize
    可以这样编写:

    @PreAuthorize("principal.permission.u_01>0")
    public class U01Controller {
    
    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("Decision.mayList(principal)")
    
    如果决策过程更复杂,那么您将开始使用bean来做决策。然后,因为这是Spring EL,所以您要编写(假设您将委托给
    决策者
    bean):


    (当然,我上面的小
    决策器
    类肯定不是bean…

    prolem用Donal的解决方案解决了。 我的错误是我犯的

    <security:global-method-security pre-post-annotations="enabled" />
    
    
    
    在根上下文中

    小心使用它,并将其放在servletContext中


    多纳尔,再次感谢。

    是的,很有趣。。。我可以写一些像@PreAuthorize(“Decision.mayList(principal)>1”)这样的东西吗?谢谢。当然可以,但我希望有多个方法——每个决策一个——每个方法都返回一个布尔值。也就是说,整个决定将取决于方法。我敢打赌,在一个非平凡的系统中,您至少可以跨业务方法重用一些决策,并且在一个地方使它们正确(在其他地方“显然”正确)对可维护性非常有价值。我将稍后再试,并接受您的回答或额外询问您。谢谢。请看基本票的更新。我仍然有问题。
    @PreAuthorize("@decider.mayList(principal)")
    
    <security:global-method-security pre-post-annotations="enabled" />