2011-11-24 110 views
5

使用javax.security.Principal,您可以通過注入EJBContext@Resource來檢索用戶信息。跨多個EJB跨越用戶信息

我想要做的是添加額外的信息,這將是特定於我的應用程序和我的用戶作爲Principal的一部分。我還嘗試將這些信息包含在EJBContextcontextData()中,但這隻能持續在EJB生命週期中,而不是在多個EJB調用中持續。

有什麼方法可以擴展Principal來添加額外的信息嗎?我寧願不使用ThreadLocal或修改我的所有EJB簽名來傳遞此信息。

回答

1

最後解決了這個問題。自定義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。