Использование @RunAs между сервлетом и EJB - PullRequest
3 голосов
/ 01 февраля 2012

У меня есть следующий сервлет.

@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>

EJB Testреализуется следующим классом TestBean.

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

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

}

Проблема: когда я вызываю GuestServlet, используя пользователя, который сопоставлен только с ролью guest, EJB бросаетjavax.ejb.EJBAccessException несмотря на наличие аннотации @RunAs на сервлете.Должен ли я также сопоставить пользователя с ролью remote-guest?Если пользователь должен быть сопоставлен с guest и remote-guest, какова реальная цель @RunAs?

1 Ответ

6 голосов
/ 01 февраля 2012

Да, пользователь должен быть сопоставлен с ролью. Хотя это может быть пользователь, отличный от того, у которого есть роль «гость». Как указано в спецификации EJB 3.1 17.3.4.1:

Поскольку поставщик компонентов и сборщик приложений не В общем, знать среду безопасности операционной среда, идентификатор запуска от имени обозначается логическим именем роли, которая соответствует одной из ролей безопасности, определенных Бином Поставщик или Application Assembler в аннотациях метаданных или дескриптор развертывания.

Затем Deployer назначает участника безопасности, определенного в операционная среда, которая будет использоваться в качестве основного для запуска идентичность. Назначенный Deployer субъект безопасности должен быть принципал, назначенный роли безопасности, указанной Аннотация RunAs или по элементу role-name развертывания run-as элемент дескриптора.

И урок oracle jee6: http://docs.oracle.com/cd/E19226-01/820-7627/bnbyr/index.html

Роль @RunAs состоит в том, чтобы разрешить связь между 2 контейнерами с различными наборами ролей и пользователями (как в приведенной выше ссылке) или обеспечить идентификацию безопасности для компонентов, которые не имеют контекстов безопасности: например, компонент, управляемый сообщениями необходимо вызвать другой компонент, для которого требуется, чтобы вызывающий имел некоторые роли.

...