OpenEJB & JUnit: Sessioncontext.isCallerInRole всегда возвращает false - PullRequest
1 голос
/ 02 февраля 2011

Мне нужно написать сессионный компонент, который где-то в коде проверяет, есть ли у текущего пользователя какие-либо роли.

Для тестирования моего 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();
        }

    }
}

1 Ответ

0 голосов
/ 11 февраля 2011

Ну, видимо, это не должно работать.Это часть спецификации, что @RunAs не меняет разрешения Принципала.

Я опубликовал тот же вопрос на форуме OpenEJB (см. Nabble ) и получил там больше информацииа также лучшее решение.

...