Java spring安全权限程序检查

Java spring安全权限程序检查,java,spring,spring-security,spring-security-acl,Java,Spring,Spring Security,Spring Security Acl,我有一个spring安全ACL系统,它似乎工作得很好,只是我不确定如何以编程方式执行权限检查。 我的应用程序分为3层(视图、服务(业务)、DAO),我想在服务层执行身份验证。因此,对于将域对象作为参数的方法: @PreAuthorize("hasPermission(#proj,'write'") public Project updateProject(Project proj) { ............. } 通过注释解决了此问题。 但对于一个将没有acl的对象作为参数的方法,我必须

我有一个spring安全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 
}
现在我的服务方法收到了这种类型的参数:

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获取对象,以检查当前用户是否具有删除权限。

方法安全注释支持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
class