2012-02-01 5 views
3

私は以下のサーブレットを持っています。サーブレットとEJB間の@RunAsの使用

@DeclareRoles("remote-guest") 
@RunAs("remote-guest") 
public class GuestServlet extends HttpServlet { 

    @EJB 
    private Test test; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     test.guest(); 
    } 

} 

サーブレットは、ロールがguestのユーザーだけが呼び出せるようにマップされています。

<servlet> 
    <servlet-name>guest-servlet</servlet-name> 
    <servlet-class>test.web.GuestServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>guest-servlet</servlet-name> 
    <url-pattern>/guest</url-pattern> 
</servlet-mapping> 

<security-role> 
    <role-name>guest</role-name> 
</security-role> 

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>guest-resources</web-resource-name> 
     <url-pattern>/guest</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>guest</role-name> 
    </auth-constraint> 
</security-constraint> 

Test EJBは、以下TestBeanクラスによって実装されます。

@Stateless 
@DeclareRoles("remote-guest") 
public class TestBean implements Test { 

    @RolesAllowed("remote-guest") 
    public void guest() { 
     System.out.println("TestBean.guest()"); 
    } 

} 

問題:私だけguest役割にマップされているユーザーを使用してGuestServletを呼び出すとき、EJB、サーブレット上@RunAs注釈の存在にもかかわらず、javax.ejb.EJBAccessExceptionをスローします。また、ユーザーをremote-guestロールにマッピングする必要がありますか?ユーザーがguestremote-guestの両方にマッピングされる必要がある場合、@RunAsの実際の目的は何ですか?

答えて

6

はい、ユーザーはロールにマップする必要があります。それは "ゲスト"の役割を持つユーザーとは異なるユーザーかもしれませんが。 EJB 3.1仕様17.3.4.1で述べたように:Beanプロバイダやアプリケーションアセンブラがないので 一般に、

、運用 環境のセキュリティ環境を知って、実行としてのアイデンティティがで指定されています論理ロール名 は、Bean プロバイダまたはアプリケーションアセンブラがメタデータアノテーションで定義したセキュリティロールの1つ、または デプロイメント記述子に対応します。

Deployerは、実行環境 のプリンシパルとして使用するために、 運用環境で定義されたセキュリティプリンシパルを割り当てます。 Deployerによって割り当てられたセキュリティプリンシパルは、 RunAs注釈またはrun-asデプロイメント 記述子要素のrole-name要素で指定されたセキュリティロールに割り当てられた プリンシパルである必要があります。

およびOracle JEE6チュートリアル: http://docs.oracle.com/cd/E19226-01/820-7627/bnbyr/index.html

@RunAsの役割は、(上記のリンクのような)役割とユーザーの異なるセットを有する2つの容器との間の通信を可能にするために、またはコンポーネントのセキュリティIDを提供することである

たとえば、Message Driven Beanは、呼び出し元にいくつかの役割を持たせる必要がある別のBeanを呼び出す必要があります。

関連する問題