最後にこの問題を回避しました。カスタムPrincipal
は、JBoss ASで作成できます。 java.security.Principal
を実装するクラスを作成し、カスタム属性とgetter/setterを追加すれば十分です。ログインモジュール(例えばDatabaseServerLoginModule)login-config.xmlファイル内のモジュール・オプションを設定するとき
その後
、ちょうどprincipalClass
オプション追加:今
<application-policy name="my-security-domain">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="principalClass">com.custom.security.MyCustomPrincipal</module-option>
...
を問題であることによる既存のバグへJBossでは、注入されたEJBContext.getCallerPrincipal()
の呼び出しはカスタムプリンシパルを返さず、SimplePrincipalのプレーンなインスタンスを返します!しかし、良いニュースは、これはEJBコンテナの認証情報の検査を可能にする、次のJAASコードによって解決することができるということである。
try {
Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");
Set<Group> subjectGroups = subject.getPrincipals(Group.class);
Iterator<Group> iter = subjectGroups.iterator();
while (iter.hasNext()) {
Group group = iter.next();
String name = group.getName();
if (name.equals("CallerPrincipal")) {
Enumeration<? extends Principal> members = group.members();
if (members.hasMoreElements()) {
context = members.nextElement();
myCustomPrincipal = (MyCustomPrincipal) context;
}
}
}
} catch (PolicyContextException e) {
....
}
私は私が得るために、私のEJBの中に注入することができるPOJOに上記のコードを包みましたプリンシパルは、EJBContextクラスと同様です。