跨多个EJB跨越用户信息

问题描述:

使用javax.security.Principal,您可以通过注入EJBContext@Resource来检索用户信息。跨多个EJB跨越用户信息

我想要做的是添加额外的信息,这将是特定于我的应用程序和我的用户作为Principal的一部分。我还尝试将这些信息包含在EJBContextcontextData()中,但这只能持续在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。