使用javax.security.Principal,您可以通过EJBContext
注入@Resource
来随时检索用户信息。
我要做的是在Principal
中添加特定于我的应用程序和我的用户的额外信息。我还尝试将此信息包含在contextData()
的{{1}}中,但这仅适用于EJB生命周期而不是多个EJB调用。
有没有办法扩展EJBContext
以添加任何额外信息?我宁愿不使用ThreadLocal或修改我的所有EJB签名来传递这些信息。
答案 0 :(得分:1)
最后解决了这个问题。可以在JBoss AS中创建自定义Principal
。创建一个实现java.security.Principal
的类并添加自定义属性和getter / setter就足够了。
然后,在配置登录模块(例如DatabaseServerLoginModule)时,login-config.xml文件中的module-option只添加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的简单实例!但好消息是,这可以通过以下允许检查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) {
....
}
我将上面的代码包装在一个POJO中,我可以在我的EJB中注入,以获得与EJBContext类类似的Principal。