【问题标题】:Jackrabbit user managementJackrabbit 用户管理
【发布时间】:2011-09-16 00:03:00
【问题描述】:

我几乎找不到任何关于如何为多个用户设计和构建存储库的文档。

我是 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

【问题讨论】:

  • 实际上是 Victor,这是因为 JackRabbit 是 Java Content Repository 的实现 - 这是一个规范。 JCR ... JackRabbit .... 明白了吗?

标签: java jackrabbit user-management jcr


【解决方案1】:

我不确定所有必要的步骤是什么,但您可以查看基于 Apache JackRabbit 的 Hippo CMS 存储库。它是一个开源 CMS 和内容存储库,已经实现了基于域和方面的自己的用户管理。

您可以找到河马CMS的安全部分的来源here

【讨论】:

  • 我几乎不知道jackrabbit,我会用JR来实现这个,而且这个项目主要是关于没有任何UI的文档/元数据CRUD,所以河马不是一个好的选择。但是我一直在尝试找一些空闲时间来玩 Hippo,尤其是因为 Hippo Portal,我已经在 Liferay 上开发了几年,所以 Hippo + JetSpeed 2 对我来说听起来很不错
【解决方案2】:

如果您需要一个包含“数千名用户”的存储库,您最好使用 JAAS 登录模块,该模块基于某些外部系统(LDAP 或数据库等)对用户进行身份验证并提供角色。当您使用工作区名称和可选凭据登录到存储库时,将返回一个会话。正如您从这里看到的:http://www.day.com/maven/javax.jcr/javadocs/jcr-2.0/javax/jcr/Session.html 会话仅公开用户有权访问的节点。

如果您需要应用不同的访问控制,显然默认的 SimpleAccessManager 对您来说是不够的,因此您可能需要实现自己的 AccessManager。

【讨论】:

    【解决方案3】:

    从文档中,

    安全配置元素是 用于指定身份验证和 的授权设置 存储库

    更多信息请参见JackRabbit Security configuration docs

    【讨论】:

    • 具体来说这块“一旦用户通过身份验证,Jackrabbit 将使用配置的 AccessManager 来控制允许用户访问和修改存储库内容的哪些部分。Jackrabbit 中包含的默认 SimpleAccessManager 类实现一种非常简单的授权机制,授予所有用户完全的读取权限,并授予除匿名用户之外的所有人的写入权限。”
    • 这并不能很好地回答我的问题。实际上我昨天正在阅读这篇文章,它只是说 LoginModule 负责 auth 而 AccessManager 负责 ACL ...
    猜你喜欢
    • 2017-03-13
    • 2011-07-17
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2023-03-19
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多