我在 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。