2014-09-26 2 views
0

У меня есть простой вопрос о @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-компонент находится под защитой роли «Admin»:

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

@Resource 
private SessionContext sessionContext; 

public String doSomething() { 

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

Спасибо,

ответ

0

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

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

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