私が構築しているアプリでは、JPA/Hibernate、JSF、CDI、EJB とともに、ストレートな Java 6 EE と JBoss (Spring などは使用しない) を使用しています。
優れた一般的なセキュリティ ソリューションはあまり見つかりませんでしたが (推奨は大歓迎です)、見つけた最善の策は Apache Shiro です。
しかし、これには多くの欠点があるようです。Balus C のサイトでその一部を読むことができます。
https://balusc.omnifaces.org/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html
しかし、依存性注入とプロキシに関して、ここで既に言及されている別の大きな問題に遭遇しました。
基本的に、認証に必要なすべてを提供する適切に作成された JPA ベースの UserDAO があります。私のデータベースは、persistence.xml と mydatabase-ds.xml (JBoss 用) できちんと構成されています。
このすべての構成情報をもう一度複製して、ユーザー テーブルのクエリを shiro.ini に追加するのはばかげているようです。これが、JdbcRealm を使用する代わりに独自の Realm を作成することを選択した理由です。
これに対する私の最初の試みは、AuthorizingRealm をサブクラス化することでした...次のようなものです。
@Stateless
public MyAppRealm extends AuthorizingRealm {
@Inject private UserAccess userAccess;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken userPassToken = (UsernamePasswordToken) token;
User user = userAccess.getUserByEmail(userPassToken.getUsername());
if (user == null) {
return null;
}
AuthenticationInfo info = new SimpleAuthenticationInfo();
// set data in AuthenticationInfo based on data from the user object
return info;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO
return null;
}
}
クラス階層の上の親クラスに最終的な init() メソッドがあるため、 MyAppRealm をプロキシできないため、これはかなり失敗します。
私の 2 番目の試みは、MyAppRealm に必要なすべてのインターフェイスを実装させ、それらを AuthorizingRealm のインスタンスに委譲することでした。私はこれが好きではありませんでしたが、試してみてください。
これでさらに進みます。webapp は起動しますが、まだ不十分です。その理由は、構成ファイル shiro.ini にあり、レルムのクラスを指定します。
myAppRealm = com.myapp.MyAppRealm
これは、Shiro が MyAppRealm インスタンスの作成を担当することを示しています。したがって、CDI で管理されないため、注入されません。これはまさに私が見ているものです。
この SO answerを見てきましたが、 AuthorizingRealm のサブクラスが最終的な init() メソッドを継承するため、サブクラスをプロキシできないため、どのように機能するかわかりません。
これを回避する方法について何か考えはありますか?