2014-04-09 33 views
0

我有一個彈簧安全ACL系統,它似乎工作正常,只是我不知道我應該如何執行權限檢查編程。
我的應用程序分爲3層(視圖,服務(業務),DAO),我想在服務層執行身份驗證。因此,對於以域對象爲參數的方法:彈簧安全許可programatic檢查

@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中獲取對象來檢查當前用戶是否具有刪除權限。

回答

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類。