跨多个EJB跨越用户信息
问题描述:
使用javax.security.Principal,您可以通过注入EJBContext
和@Resource
来检索用户信息。跨多个EJB跨越用户信息
我想要做的是添加额外的信息,这将是特定于我的应用程序和我的用户作为Principal
的一部分。我还尝试将这些信息包含在EJBContext
的contextData()
中,但这只能持续在EJB生命周期中,而不是在多个EJB调用中持续。
有什么方法可以扩展Principal
来添加额外的信息吗?我宁愿不使用ThreadLocal或修改我的所有EJB签名来传递此信息。
答
最后解决了这个问题。自定义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。