Использование аннотации @RunAs на сервлете

У меня простой вопрос о @RunAs.

Помимо EJB, могу ли я использовать @RunAs на сервлете для распространения роли безопасности? например как:

У меня есть общедоступный сервлет:

@WebServlet(name = "RunAsServlet", urlPatterns = "/runAs")
@RunAs("Admin")
public class RunAsServlet extends HttpServlet {

@EJB
private MyEjb ejb;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.getWriter().write(ejb.doSomething());
    }
}

И EJB защищен под ролью «Администратор»:

@Stateless
@RolesAllowed("Admin")
public class MyEjb {

@Resource
private SessionContext sessionContext;

public String doSomething() {

В этом случае я должен иметь возможность вызывать RunAsServlet, поскольку на нем находится @RunAs, у него должна быть правильная роль «Администратор» для вызова защищенного метода EJB из веб-запроса. Я прав в этом примере? Или мне нужна другая дополнительная конфигурация?

Спасибо,


person user1684651    schedule 26.09.2014    source источник


Ответы (1)


Вам нужно сопоставить конкретного пользователя с ролью roleOnServlet, и этот пользователь также должен быть в роли Admin. Либо это опечатка, либо у вас 2 разные роли roleOnServlet != Admin. Обычно в сервлете используется то же имя роли, что и в вызываемом EJB. Как и в вашем случае, хотя сервлет будет работать от имени пользователя в роли roleOnServlet, ему не обязательно одновременно находиться в роли Admin, что приведет к ошибке.

@RunAs не меняет текущего пользователя на эту роль, а использует отдельного пользователя, который должен быть одним из пользователей, сопоставленных с ролью roleOnServlet.

Сопоставление пользователя с ролью runAs зависит от конкретного контейнера, поэтому, если вам нужна помощь в этом, добавьте информацию о том, какой сервер вы используете.

person Gas    schedule 26.09.2014