更新(17.04.2012):所以我有什么结果。
根上下文.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"/>
权限管理器.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 应用程序
- 自定义用户详细信息服务
自定义 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")
提前致谢。