最後解決了這個問題。自定義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()
的調用不會返回自定義Principal,而是SimplePrincipal的普通實例!但好消息是,這可以通過以下JAAS代碼,使EJB容器認證信息的檢查來解決:
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) {
....
}
我包裹在一個POJO上面的代碼,我可以在我的EJB來獲得注入類似於EJBContext類的Principal。