2011-06-16 122 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。