2009-12-17 57 views
6

我想使用Spring Security來管理用戶,組和權限。Group and acl on Spring Security

我想使用ACL來保護我的域對象,但我找不到一種方法將組分配給acl。

例如: 我有用戶和組。每個組可以有以下證券: - 管理論壇(可以是一個像ROLE_FORUM_MANAGER的角色) - 編輯一個特定的論壇(特定論壇上的acl)。

此外,組由具有角色ROLE_PERMISSION_MANAGER的用戶定義。但是此用戶定義的所有組只能由該用戶進行編輯和管理。所以組被附加到用戶。確切地說,想象一下用戶創建一個谷歌組:這個用戶只能管理他創建的組的權限組。因此,他可以創建小組來管理自己的谷歌組的特定論壇。

我該怎麼辦?

我讀了春天的安全文檔和以下教程(所以請不要給我這些鏈接): http://grzegorzborkowski.blogspot.com/2008/10/spring-security-acl-very-basic-tutorial.html ​​

回答

14

檢查Spring Security 3.0,您可以通過使用Spring表達式語言來避免使用ACL。

例如,對於編輯一個論壇,你會確保這樣的方法:

@PreAuthorize("hasRole('ROLE_FORUM_MANAGER') and hasPermission(#forum,'update')) 
public void updateForum(Forum forum) { 
    //some implementation 
} 

你可以這樣實現自定義權限評估調用hasPermission方法,如:

public class ForumPermissionEvaluator implements PermissionEvaluator { 

    public boolean hasPermission(Authentication authentication, 
      Object domainObject, Object permission) { 
     //implement 
    } 

    public boolean hasPermission(Authentication authentication, 
      Serializable targetId, String targetType, Object permission) { 
     //implement 
    } 
} 

最後,在應用程序配置中將它們連接在一起:

<beans:bean id="expressionHandler" 
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <beans:property name="permissionEvaluator" ref="permissionEvaluator"/> 
</beans:bean> 

<beans:bean id="permissionEvaluator" 
    class="com.centrix.core.security.GroupPermissionEvaluator" /> 
+0

是的,我以前見過它,但是因爲spring security 3不是正式版本,所以我不會使用它,但是我想我會稍微等一下使用它。 – 2009-12-22 16:40:42

+0

要使用諸如「#forum」之類的方法參數來執行此操作,必須將調試信息留在生產JAR中....可能不是一個好主意。 – HDave 2010-06-01 01:54:41

+0

在bean連線中,最後一個元素應該是「ForumPermissionEvaluator」而不是「GroupPermissionEvaluator」?另一個問題:如果你想擁有多個PermissionEvaluator,那麼這將如何連接,因爲只有一個expressionHandler? – 2011-05-25 00:15:50

1

我做了類似的「手動」的東西:即我有我自己的代碼確定哪些實例可以被特定用戶編輯/刪除,並且只依賴Spring安全來確保它們具有訪問功能併爲當前用戶提供角色/認證信息的正確角色。

因此,在我的代碼中,我確定了當前的主體(我們自己的User類),並基於此決定了此用戶對特定實例擁有的權限。

public static User getCurrentUser() { 
    User user = null; 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    if (auth != null) { 
     Object principal = auth.getPrincipal(); 
     if (principal instanceof User) { 
      user = (User)principal; 
     } 
    } 
    return user; 
} 
+0

但我不明白你如何申請一個acl到你的案例中的一個組? – 2009-12-18 11:06:35

+0

我沒有真正使用acl,但組和用戶都是實體並且具有(雙向)關係(由hibernate管理)。要確定用戶是否可以對某個組執行特殊操作,請檢查當前主體是否爲該組的主持人(即該組包含在用戶的'moderates'集合中)。 因此,每個組的主持人列表基本上都是該組的「ACL」,並且在數據庫中進行管理,而不是在彈簧安全配置中進行管理。 – 2009-12-18 12:12:18

2

我只是使用你的組像角色。我發現Spring的ACL實現相當笨拙,而且大部分都不可用。只需將用戶分配到「組」(所有實際角色),並按照正常的基於角色的授權進行檢查。

+0

因此,我可以動態地創建一個像「GROUP_15」這樣的權限,然後在論壇75中添加GrantedAuthoritySid(「GROUP_15」)的acl。 如果我能做到這一點,這對我很好。但我需要動態創建所有角色和權限。 – 2009-12-18 16:39:19

+0

你可以做到這一點,但不能與Spring Annotations一起使用,至少開箱即可。您在註釋中使用的「角色」是硬編碼的,不是動態的。我會建議編寫自己的MethodInterceptor並從他們的 - 這是一個簡單的接口,並不需要太多的代碼。 – Gandalf 2010-10-27 13:23:43