2011-06-16 76 views
5

我幾乎找不到有關如何爲多個用戶設計和構建存儲庫的任何文檔。Jackrabbit用戶管理

我是Jackrabbit的新手,並且總是使用一個主用戶憑證來構建僅由一位主用戶訪問的存儲庫。

現在我需要一個由數千用戶共享的存儲庫,每個用戶使用他的節點並且沒有其他權限。

的的SimpleAccessManager很簡單:

public boolean isGranted(ItemId id, int permissions) throws RepositoryException { 
    checkInitialized(); 
    if (system) { 
     // system has always all permissions 
     return true; 
    } else if (anonymous) { 
     // anonymous is always denied WRITE & REMOVE permissions 
     if ((permissions & WRITE) == WRITE 
       || (permissions & REMOVE) == REMOVE) { 
      return false; 
     } 
    } 

    return true; 
} 

它看起來是一個不能創造這樣與SimpleLoginModule和的SimpleAccessManager一個多用戶系統信息庫。因爲它僅區分ADMIN並能讀到的一切,但不能寫匿名用戶之間......

這樣一個必須使用DefaultAccessManager也許做這樣的事情:

Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray())); 

UserManager um = ((JackrabbitSession) session).getUserManager(); 
User user = um.createUser("john", "doe"); 

/* And assign some ALC as follows... And then play with it like this, which really sucks without proper documentation, one has to reverse engineer everything, wtf */ 

AccessControlManager acm = session.getAccessControlManager();  
AccessControlPolicyIterator it = acm.getApplicablePolicies(testRootNode.getPath()); 
while (it.hasNext()) { 
    AccessControlPolicy acp = it.nextAccessControlPolicy(); 

    Privilege[] privileges = new Privilege[]{acm.privilegeFromName(Privilege.JCR_WRITE)}; 

    ((AccessControlList)acp).addAccessControlEntry(new PrincipalImpl(user.getUserID()), privileges); 

    acm.setPolicy(testRootNode.getPath(), acp); 
} 

儲存庫將通過訪問OpenCMIS從客戶端提供用戶憑據。

編輯:這就是我一直在尋找AccessControl

+2

其實Victor是因爲JackRabbit是一個Java Content Repository的實現 - 這是一個規範。 JCR ... JackRabbit ....明白了嗎? – MJB 2011-06-16 06:45:35

回答

0

從文檔,

安全配置元素 用於指定 庫

認證和 授權設置

查看JackRabbit Security configuration docs瞭解更多信息。

+0

具體來說,這篇文章「一旦用戶被認證,Jackrabbit將使用配置的AccessManager來控制允許用戶訪問和修改的存儲庫內容的哪些部分。Jackrabbit中包含的默認SimpleAccessManager類實現了一個簡單的授權機制,完全讀取所有用戶的訪問權限,並向匿名用戶以外的所有人寫入訪問權限。「 – MJB 2011-06-16 06:44:33

+0

這並不能回答我的問題。其實我昨天在看這個,它只是說LoginModule負責認證,而AccessManager負責ACL ... – lisak 2011-06-16 08:37:08

2

我不確定所有必要的步驟是什麼,但您可以看看基於Apache JackRabbit的Hippo CMS存儲庫。它是一個開源CMS和內容存儲庫,基於域和方面實施了自己的用戶管理。

你可以找到Hippo CMS here安全部分的來源。

+0

我幾乎不知道長耳兔,我會用JR爲初學者實現這個,而且這個項目主要是關於文檔/元數據CRUD沒有任何用戶界面,所以河馬不是一個好的選擇。但是我一直在努力獲得一些空閒時間來玩Hippo,特別是因爲Hippo Portal,我已經在Liferay開發了幾年,所以Hippo + JetSpeed 2聽起來對我很好 – lisak 2011-06-17 16:09:12

2

如果您需要一個擁有「數千用戶」的存儲庫,最好使用基於某個外部系統(LDAP或數據庫等)對用戶進行身份驗證並提供角色的JAAS登錄模塊。使用工作區名稱和可選憑據登錄到存儲庫時會返回會話。正如您從這裏可以看到的:http://www.day.com/maven/javax.jcr/javadocs/jcr-2.0/javax/jcr/Session.html會話只會公開用戶有權訪問的節點。

如果您需要應用不同的訪問控制,顯然缺省的SimpleAccessManager對您來說是不夠的,因此您可能需要實現自己的AccessManager。