私が開発しているアプリケーションでは、JPA/Hibernate、JSF、CDI、およびEJBとともに、まっすぐなJava 6 EEとJBoss(春などは使用しない)を使用しています。カスタムShiroでCDIマネージドBeanを注入するAuthorizeRealm
私は多くの良い一般的なセキュリティソリューション(推奨は歓迎です)が見つかりませんでしたが、私が見つけた最も良い賭けはApache Shiroです。
しかし、これには多くの欠点があるようです。そのうちのいくつかは、あなたはBalus C'sサイトで約読むことができます:
http://balusc.blogspot.com/2013/01/apache-shiro-is-it-ready-for-java-ee-6.html
しかし、私はすでに依存性注入とプロキシに関するhereを述べているもう一つの大きな問題につまずいてきました。
基本的には、認証に必要なすべての機能を備えたJPAベースのUserDAOがあります。私のデータベースは、persistence.xmlとmydatabase-ds.xml(JBoss用)できれいに設定されています。
この設定情報をすべて二度と複製してユーザテーブルクエリをshiro.iniに追加するのは馬鹿馬鹿しいようです。だから、私はJdbcRealmを使うのではなく、自分のRealmを書くことを選んだのです。この時
私の最初の試みは、AuthorizingRealmをサブクラス化することだった...のようなもの:親クラスの最後のinit()メソッドがあるのでMyAppRealmがプロキシすることができませんので
@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;
}
}
は、これは、かなり悪い失敗しますクラス階層を作成する。
MyAppRealmに必要なすべてのインターフェイスを実装し、それをAuthorizingRealmのインスタンスに委譲するという2番目の試みでした。私はこれが好きではありませんでしたが、試してみるかもしれません。
これはさらに私を得る、webappが起動しますが、まだ不足しています。その理由は、私は私のレルムのクラスを指定し、shiro.ini、設定ファイルである:
myAppRealm = com.myapp.MyAppRealm
これはかなり史郎がMyAppRealmインスタンスを作成するための責任を負うことを私に伝えます。したがって、CDIは管理されず、注入もされません。これはまさに私が見ているものです。
私はこれを見てきましたが、AuthorizingRealmのサブクラスが最終的なinit()メソッドを継承し、サブクラスをプロキシできないことを意味するため、どのように動作するのかわかりません。
私はこれをどのように回避することができますか?
ありがとうございます。これは非常に良い理論的な答えであり、この点に関しては頭の爪に当たります。私はbeanmanagerを使って '橋'をうまく構築したと思う。それはまったく可愛いわけではありませんが、私はそれを進化させて時間をかけて洗練させたいと考えています。 – lostdorje