2011-02-02 9 views
1

現在のユーザーに何らかの役割がある場合、コードチェックのどこかでセッションBeanを記述する必要があります。OpenEJB&JUnit:Sessioncontext.isCallerInRoleはallways falseを返します

私のEJB3をunittestするには、私はOpenEJBを試しています。私はtesting securityについての例を続けましたが、私がSessionContect.isCallerInRole()でその役割を自分のコードでテストすると、常にfalseが返されます。

なぜ機能しないのですか?

説明するためのコードを記述しました。

私のローカルインタフェース:

@Local 
public interface MyBean { 

    boolean doSomething(); 

} 

マイEJB:

@Stateless 
public class MyBeanImpl implements MyBean { 

    @Resource 
    private SessionContext sessionContext; 

    @Override 
    public boolean doSomething() { 
     return this.sessionContext.isCallerInRole("role1"); 
    } 

} 

私のテスト:

public class MyBeanTest { 

    private Context context; 

    @Before 
    public void setUp() throws Exception { 
     final Properties properties = new Properties(); 
     properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory"); 

     this.context = new InitialContext(properties); 
    } 

    @Test 
    public void test1() throws Exception { 
     final Caller roleBean = (Caller) this.context.lookup("RoleBeanLocal"); 
     roleBean.call(new Callable<Object>() { 

      @Override 
      public Object call() throws Exception { 
       final MyBean myBean = (MyBean) MyBeanTest.this.context.lookup("MyBeanImplLocal"); 
       Assert.assertTrue(myBean.doSomething()); 
       return null; 
      } 
     }); 
    } 

    @Test 
    public void test2() throws Exception { 
     final Caller role2Bean = (Caller) this.context.lookup("Role2BeanLocal"); 
     role2Bean.call(new Callable<Object>() { 

      @Override 
      public Object call() throws Exception { 
       final MyBean myBean = (MyBean) MyBeanTest.this.context.lookup("MyBeanImplLocal"); 
       Assert.assertFalse(myBean.doSomething()); 
       return null; 
      } 
     }); 
    } 

    public static interface Caller { 

     <V> V call(Callable<V> callable) throws Exception; 

    } 

    @Stateless 
    @RunAs("role1") 
    public static class RoleBean implements Caller { 

     @Override 
     public <V> V call(final Callable<V> callable) throws Exception { 
      return callable.call(); 
     } 

    } 

    @Stateless 
    @RunAs("role2") 
    public static class Role2Bean implements Caller { 

     @Override 
     public <V> V call(final Callable<V> callable) throws Exception { 
      return callable.call(); 
     } 

    } 
} 

答えて

0

まあ、明らかに動作するようになっていません。 @RunAsがプリンシパルのアクセス許可を変更しないという仕様の一部です。

私は同じ質問をOpenEJBフォーラム(Nabbleに掲載)に掲載し、より良い解決策と同様にいくつかの情報を得ました。

関連する問題