【问题标题】:Has the JCA Ever Worked? It can't according to its documentationJCA 曾经工作过吗?它不能根据其文档
【发布时间】:2014-04-20 19:32:53
【问题描述】:

我正在使用自定义 JAAS 登录模块开发 Jackrabbit 的 JCA 实现。这个想法是通过登录模块集成 Apache Shiro 身份验证和授权,使用 RepositoryLoginContext 简单地从 Shiro 令牌中为回调函数提供用户名和密码。 (我只有少数用户,配置了一个shiro.ini文件。)

在我尝试连接到存储库之前,所有部分似乎都适合。一种尝试是

SimpleCredentials userJCACredentials = new SimpleCredentials(username,shriroUserCreds.getPassword().toString());

但我似乎无法找到让它快乐的构建路径 JAR。 Jackrabbit API 文档让我很困惑。如果我查找 SimpleCredentials,我会得到一个 Day Software 页面 (!) 但是如果我查找 CryptedSimpleCredentials,我会得到一个 Apache 页面。考虑到可能只有加密版本可以与资源适配器一起使用,我尝试更改为该版本,但遇到了同样的问题

connInfo = new JCAConnectionRequestInfo(cryptedCreds,workspaceName)

在第一个参数中只需要 SimpleCredentials。我一直在 API 中寻找死胡同,例如 JCAConnectionRequestInfo(Credentials creds, String workspace)。如果您单击凭据链接,则会超时。另一个 gem 是 JCAManagedConnectionFactory 的构造函数之一,其中包含有关 IBM Websphere (!!) 的文本。

我尝试编写自己的类(基于简单凭据)实现 Credentials 接口和错误

new JCAConnectionRequestInfo(cryptedCreds,workspaceName)

变成无法解析 javax.jcr.Credentials。对于 Jackrabbit 安装,javax.jcr 路径不存在(至少对于资源适配器版本)。

由于无法理解上述内容,我尝试了第二种方法。

repoParameters.put("homeDir",ARCHIVE_REPO_DIR);
repoParameters.put("configFile",ARCHIVE_REPO_CONFIG);
repoMan = JCARepositoryManager.getInstance();
repo = repoMan.createRepository(repoParameters);

最后一行,使用 Map 参数,由 Eclipse 自动完成提示,与显示 createRepository(string, string) 的文档冲突。在任何情况下,都会出现关于 javax.jcr.Repository 解析的错误。回到同样的事情。

我已经探索了库中的每条自下而上的路径以获取会话。这似乎是不可能的,最终因为不存在的定义而失败。

查看源代码,我已经组装了以下

 JCAManagedConnectionFactory mcf = new JCAManagedConnectionFactory();
    mcf.setConfigFile(...);
    mcf.setHomeDir...);
    try {
        mcf.setLogWriter(lpw);
        connectionFactory = mcf.createConnectionFactory();
    } catch (ResourceException rex) {
        logger.error("client session failed to create connection factory");
        logger.error(rex);
    } finally {
        success = false;
    }
    if (success) {

        repo = (RepositoryImpl) connectionFactory;
        session = repo.login( needs Credentials Here );
    }

登录调用需要凭据和工作区名称。如果登录将由 JAAS 处理,我希望找到一个没有参数的 login(),其中 JAAS 登录将接管。

【问题讨论】:

    标签: jackrabbit


    【解决方案1】:

    几年前,我在一个项目中使用了jackrabbit,并取得了一些小的成功,但后来从jackrabbit 转移到modeshape,这是JCR 的替代实现(JSR-283。这是一个非常活跃的项目我有一个(非常小的)参与。随着新版本的定期发布,开发继续以极快的速度进行。

    我从 2.8 版开始,它还不错,但 3.0 版几乎完全重写,重点是性能,使用起来很愉快。 4.0 现在处于发布的最后阶段。

    从 Jackrabbit (2.2.7) 到 Modeshape (2.8.1) 的转换相对轻松,大部分工作都在设置配置和运行时。

    我并不是说你不会像在 Jackrabbit 中看到的那样发现问题,但如果你在 modeshape 论坛中提问,你会得到很好的答案和大量持续的帮助。

    【讨论】:

    • 我将研究 modeshape。前段时间我玩弄了 Jackrabbit,使用的是独立版本。当我回到这个项目时,我开始使用 JCA(例如 Geronimo 的资源适配器)并变得非常困惑。在这一点上我面临的唯一障碍是 JAAS。我将通过用我所学的知识来回答原始问题。感谢您的意见。
    【解决方案2】:

    经验教训:

    整合 Shiro 并不是一个好主意,但完全不是因为 Shiro。 JCA 需要 JAAS 登录。 “集成” Shiro 需要对 JAAS 有足够的了解,我不妨直接采用 JAAS 并完成它。但走得更远,我意识到这很好。前面还有更大的问题。

    JAAS 就是 JAAS。尽管我已经走了很远,但我还是无法轻而易举地通过它并拿起我需要的东西。帖子中最后一个难题的答案很简单,调用的登录方法在 JCA 中找不到,它在 JAAS 登录模块中找到,您可以通过 Geronimo 管理控制台为您创建一个新的安全实体进行编码和“注册”应用。 JAAS 学习曲线的很大一部分是它的模型非常抽象。没有“简而言之 Geronimo 的 JAAS”来启发潜在的程序员。另一部分是它被广泛使用,特定于所有事物的信息,但我正在做的事情似乎无处不在。这并不奇怪,因为到目前为止,Web 应用程序是它的最大用途。在此之后,找到一个带有 Jackrabbit 的 JAAS 登录模块也就不足为奇了,因为 JCR 是为 Web 内容设想的。

    事实证明,钻研 JAAS 虽然很有启发性,但完全是在浪费时间。 在努力将 JAAS 整合在一起之后,我终于有了一个 Jackrabbit 会话句柄。我立即将其用于处理 utx 包装的旧代码。

    这里的一切都停止了。从 getRootNode() 开始,我的旧代码都不起作用。我让 Eclipse 向我展示了会话句柄的可能方法,并且我测试了每一个。那些工作的名单很短。一些与 UTX 相关的东西可以工作,就像“equals”、hasCapabilty、isLIve 和其他东西一样。会话句柄的六十多个方法不起作用。这意味着没有办法获得节点。这意味着您无法对 JCA 做任何有用的事情。

    至于我最初的问题,我会说 JCA 在某一时刻可能确实有效。毕竟,没有人会编写所有这些东西只是为了把它们排成一行。而且我还要说,每当修改代码以使用 JAAS 时,它都会被严重破坏并变得无用。

    这真的是一个肥皂盒时刻。我在这方面投入的时间非常可观。我想使用 Jackrabbit 的一个原因是它可以在 Geronimo 中与我的应用程序在同一个 JVM 中运行。我可以理解不符合标准的文档和开源的其他现实。但我只能推测这是如何发生的,而替代方案都是相当消极的。我早些时候闻到了老鼠的味道,但什么也没说。

    有一点很清楚。 JCA(据我所知,Jackrabbit 项目的其余部分)没有被吹捧为 Apache 项目的业务。这对他们的名字是一种伤害,对被带入死胡同的开发人员是一种极大的伤害。

    我不知道该怎么做,但我想提请 Apache 基金会注意,如果没有其他原因,就是阻止其他人经历这件事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多