Java @PreAuthorize中的自定义类主体
更新(2012年4月17日):所以我得到了结果 root-context.xml: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
<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" />