跨多个EJB跨越用户信息

时间:2011-11-24 21:14:31

标签: java java-ee-6 ejb-3.1

使用javax.security.Principal,您可以通过EJBContext注入@Resource来随时检索用户信息。

我要做的是在Principal中添加特定于我的应用程序和我的用户的额外信息。我还尝试将此信息包含在contextData()的{​​{1}}中,但这仅适用于EJB生命周期而不是多个EJB调用。

有没有办法扩展EJBContext以添加任何额外信息?我宁愿不使用ThreadLocal或修改我的所有EJB签名来传递这些信息。

1 个答案:

答案 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。