我有一个弹簧安全ACL系统,它似乎工作正常,只是我不知道如何以编程方式执行权限检查。
我的应用程序分为3层(视图,服务(业务),DAO),我想在服务层执行身份验证。因此,对于一个以域对象作为参数的方法:
@PreAuthorize("hasPermission(#proj,'write'")
public Project updateProject(Project proj) {
.............
}
问题通过注释解决
但是对于一个方法,它将一个没有acl的对象作为参数,我必须以编程方式检查用户是否有权限。
假设我有一个对象ProjectWrapper:
public class ProjectWrapper {
private Project project;
private Something something;
// setters and getters here
}
所以现在我的Service方法收到了这种类型的参数:
public Project updateProject(ProjectWapper projWrapp) {
Project p = projWrapp.getProject();
// before performing any operation on project I need to know if current user has neccessary permissions on this object
// ??? how do i check that ?
}
我是否需要使用AclService来执行该操作?就像我需要创建/更新权限,或者是否有更清洁/更好的可能性? 对于deleteProject(Long id)方法的同样问题,首先我必须从db获取对象以检查当前用户是否具有删除权限。
答案 0 :(得分:1)
方法安全注释支持Spring EL表达式。对于您的包装类,您可以按如下方式使用它。
@PreAuthorize("hasPermission(#projectWrapper.project, 'write'")
public Project updateProject(ProjectWrapper projectWrapper) {
// body omitted
}
如果您只有一个对象标识符而不是实际对象,则可以使用下面的模式。
@PreAuthorize("hasPermission(#id, 'my.package.Project' 'delete'")
public void deleteProject(Long id) {
// body omitted
}
您可能需要调整默认配置(例如,检索对象标识的策略等)以满足您的要求。有关详细信息,请参阅org.springframework.security.acls.AclPermissionEvaluator
课程。