1

Glassfish 4 で Jackrabbit 2.6.4 を実行しています。提供された rar を使用して、コネクタ リソースとして Jackrabbit をデプロイしました。

ステートレス EJB の内部から Jackrabbit リポジトリを呼び出してノードなどを作成できるように、それを起動して実行しています。現在、すぐに提供されるデフォルトの LoginModule メカニズムを独自のカスタム LoginModule に置き換えようとしています。

これまでのところ、私は持っています:

  • ユーザーのプリンシパル (現在は、admin、read、write などの文字列値) を返すカスタム Realm と LoginModule を作成し、これを 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 型の原則が含まれていることを期待していることです。 JackRabbit クラス。

  • これを回避するための最初の試みは、独自の AccessManager を作成することでしたが、WAR にあるため、JackRabbit はこれをインスタンス化できず、コネクタ リソース内の JackRabbit コードでは使用できません。

  • 私の次の試みは、Jackrabbit に渡す前に EJB 内のサブジェクトにプログラムで原則を追加することでした。JackRabbit 型の原則を含むサブジェクトを必要とする Jackrabbit 内のバックグラウンド スレッドもあります。

カスタムJAASグラスフィッシュログインモジュールをGlassfish内のJackrabbitで動作させる方法に完全に困惑しており、誰かがこれを理解しているかどうか疑問に思っています.

それまでの間、私は現在、JackRabbit のセキュリティをあきらめて、アプリケーション レイヤーですべて処理し、内部でデフォルトのログイン モジュールを使用して Jackrabbit にログインすることを検討しています。

4

1 に答える 1

0

最終的に、Glassfish、JackRabbit、および JAAS を連携させて、JackRabbit がセッションの作成に使用するカスタム LoginModule を使用してサブジェクトを作成できるようにしました。以下は、元の質問で説明されているこの問題を解決するために私が取った手順です。

  1. JackRabbit RAR (モデル 2 ) を使用する代わりに、JackRabbit Jars を戦争 (モデル 1 ) に含めるようになりました。これにより、JackRabbit 型の原則に依存しない独自のカスタム AccessManager を実装することができました。このアプローチの最大の欠点は、自分でリポジトリを作成してシャットダウンする必要があることです。私が行った解決策は、リポジトリを作成し、dispose メソッドでシャットダウンする ApplicationScoped CDI Producer でした。これにより、リポジトリをクラスに簡単に挿入できます。

  2. jackrabbit-core にパッチを適用することで、JackRabbit が Glassfish でサブジェクトを見つけるという問題を解決しました。この問題はしばらく前から発生しているようで ( JCR-3188を参照)、パッチが提供されていますが、ソース コードには含まれていません。2.6.4 にパッチを適用したところ、JackRabbit は Glassfish でサブジェクトを見つけて使用できるようになりました。

于 2013-12-05T21:07:37.317 に答える