2011-11-24 8 views
5

javax.security.Principalを使用すると、いつでもEJBContext@Resourceを挿入することで、ユーザー情報を取得できます。複数のEJBにわたるユーザー情報の広がり

私がしようとしているのは、Principalの一部として私のアプリケーションとユーザーに固有の追加情報を追加することです。この情報をのEJBContextに含めることも試みましたが、これは複数の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()の呼び出しはカスタムプリンシパルを返さず、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) { 
     .... 
    } 

私は私が得るために、私のEJBの中に注入することができるPOJOに上記のコードを包みましたプリンシパルは、EJBContextクラスと同様です。

関連する問題