1

コードのどこかに、現在のユーザーが何らかの役割を持っているかどうかをチェックするセッションBeanを作成する必要があります。

私のEJB3をユニットテストするために、私はOpenEJBを試しています。セキュリティのテストに関する彼らの例に従いましたが、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();
        }

    }
}
4

1 に答える 1

0

まあ、どうやらそれは動作するはずではありません。@RunAsこれは、プリンシパルの権限を変更しない仕様の一部です。

私はOpenEJBフォーラム(Nabbleでそれを参照)に同じ質問を投稿し、そこでいくつかのより多くの情報とより良い解決策を得ました。

于 2011-02-11T08:44:48.270 に答える