1

我在 Glassfish 4 中运行 Jackrabbit 2.6.4。我已经使用提供的 rar 将 Jackrabbit 部署为连接器资源。

我已经启动并运行了它,以便我可以从无状态 EJB 内部调用 Jackrabbit 存储库并可以创建节点等。我现在正尝试用我自己的自定义 LoginModule 替换开箱即用的默认 LoginModule 机制。

到目前为止,我有:

  • 创建了一个自定义领域和 LoginModule,它返回一个用户原则(当前是字符串值,例如 admin、read、write)并将其部署到 domain/lib 目录

  • 使用角色配置我的 web.xml 和 sun-web.xml 文件以对映射进行分组并启用基本身份验证。这一切都按预期工作,我可以在我的 EJB 上强制执行角色。

  • 让 Jackrabbit 使用我的自定义登录模块而不是它自己的(我从 repository.xml 中删除了登录模块配置并更改了安全应用程序名称以匹配我的域名)

我现在遇到以下问题:

  • Jackrabbit 在我登录时没有找到应用程序容器创建的现有主题。这似乎是 Jackrabbit 查找主题的方式的问题:

        AccessControlContext acc = AccessController.getContext();
        subject = Subject.getSubject(acc);
    

    这在 Glassfish 中返回 null。相反,您似乎需要使用:

         Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");
    

    我通过使用上面的代码获取主题然后登录到 Subject.doAs 块内的存储库来解决这个问题,例如

     Subject.doAs(subject, new PrivilegedAction<String>() {
            @Override public String run() {
                Session session = null;
                try {
                    session = repository.login();
                 } catch (RepositoryException e) {
                    log.error("Failed", e);
                } finally {
                    if (session != null) {
                        session.logout();
                    }
                }
    
  • 这现在有效,但下一个问题是 JackRabbit DefaultAccessManager 期望主题包含 JackRabbit 类型的原则,例如 org.apache.jackrabbit.core.security.SystemPrincipal ,我无法从我的自定义登录模块返回,因为它无权访问JackRabbit 课程。

  • 我第一次尝试解决这个问题是创建我自己的 AccessManager 但 JackRabbit 无法实例化它,因为它在我的 WAR 中,并且对于连接器资源中的 JackRabbit 代码不可用。

  • 我的下一个尝试是在将其传递给 Jackrabbit 之前以编程方式将原理添加到我的 EJB 中的 Subject,这很有效,但后来我发现在 glassfish 的 EJB 中运行 Subject.doAs 会导致许多问题,并且似乎不受支持。Jackrabbit 内部也有后台线程,需要一个包含 JackRabbit 类型原则的主题。

我现在完全不知道如何让自定义 JAAS glassfish 登录模块与 Glassfish 中的 Jackrabbit 一起使用,我想知道是否有人已经弄清楚了这一点。

与此同时,我目前正在考虑放弃 JackRabbit 的安全性并在我的应用程序层中处理这一切,只使用默认登录模块来登录 Jackrabbit。

4

1 回答 1

0

我终于让 Glassfish、JackRabbit 和 JAAS 一起工作,这样我就可以使用我的自定义 LoginModule 创建一个主题,JackRabbit 然后用它来创建一个会话。以下是我为解决原始问题中描述的此问题而采取的步骤:

  1. 我现在不使用 JackRabbit RAR(模型 2),而是将 JackRabbit 罐子包含在我的战争(模型 1)中。这使我能够实现自己的不依赖于 JackRabbit 类型原则的自定义 AccessManager。这种方法的最大缺点是我现在必须自己创建和关闭存储库。我采用的解决方案是一个 ApplicationScoped CDI Producer,它创建 repo 并在 dispose 方法中将其关闭。这使得将 repo 注入到类中变得很容易。

  2. 我通过修补 jackrabbit-core 解决了 JackRabbit 在 Glassfish 中查找主题的问题。看来这个问题已经存在一段时间了(JCR-3188),并且已经提供了一个补丁,但从未包含在源代码中。我将补丁应用到 2.6.4,JackRabbit 现在能够在 Glassfish 中找到和使用主题。

于 2013-12-05T21:07:37.317 回答