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 にログインすることを検討しています。