Glassfish 3.1、B06 を使用して Java EE 6 アプリケーションを開発しています。アプリを保護するために、JDBCRealm とプログラムによるセキュリティを使用しています。これは、ユーザー名とパスワードをチェックするのにうまく機能します。しかし、セキュリティ ロールの宣言に関しては、次のような問題があります。
Java EE 6 でセキュリティ ロールを使用するには、EJB デプロイメント記述子と Glassfish 固有のデプロイメント記述子の両方でこれらのロールを宣言して、それらのロールをリンクする必要があります ( Java EE 6 チュートリアルで説明されているように) EJB 内のメソッドisCallerInRole(String roleRef)を使用して権限を確認します。
これは私のアプリケーションには望ましくありません。XML ファイルを作成せずに (たとえば、データベースでロール名を定義できるようにするなど)、セキュリティ ロールを動的かつプログラム的に追加できるようにしたいからです。
GF3 ソース コードをデバッグしたところ、 com.sun.ejb.containers.EjbContextImplに isCallerInRole が実装されていることがわかりました。そこで、コンテナーは EJB 記述子からロールを取得します。
public boolean isCallerInRole(String roleRef) {
(...)
EjbDescriptor ejbd = container.getEjbDescriptor();
RoleReference rr = ejbd.getRoleReferenceByName(roleRef);
(...)
}
周りを見回したところ、アプリケーション内でどうにかして EJB 記述子を取得できれば、次のようなロールを追加できることがわかりました。
EjbDescriptor ejbd = //??? Can i use that descriptor inside my app, or is that "forbidden"?
RoleReference rr = new RoleReference("admin", "Admins are allowed to do everything");
ejbd.addRoleReference(rr);
誰かがこのようなことをしたり、それについて考えたりしましたか? アプリケーション内で EJB デプロイメント記述子を使用することはできますか? または、より良いアプローチがありますか?
PSまたはMBeanを使用してロールを追加する必要がありますか? ここでかなり関連する投稿を見つけました。