Веб-сервис JAX-WS и @rolesAllowed

Можно ли использовать аннотацию @RolesAllowed в веб-сервисе JAX-WS и если да, то как?

У меня есть веб-сервис на glassfish 3.1.1, использующий Basic Authentication, но ограничения, выраженные с помощью @RolesAllowed, игнорируются. Информация о роли должна быть доступна, так как я могу получить доступ к ней следующим образом:

@Resource
WebServiceContext wsContext;

if (wsContext.isUserInRole("READ"))
log.info("Role: READ");

Я получаю ожидаемую роль, но все методы доступны, даже если @RolesAllowed установлен на другую роль. @DenyAll также не работает.

Если эти аннотации не поддерживаются, можно ли использовать дескрипторы развертывания для управления доступом к методам веб-сервиса на основе ролей пользователей?

Edit: В этой части учебника по JAVA EE 6 описывается использование аннотации @RolesAllowed. Она гласит

Для компонентов Java EE вы определяете роли безопасности с помощью аннотаций метаданных @DeclareRoles и @RolesAllowed.

Веб-службы не перечислены как компоненты Java EE в первой части руководства, поэтому похоже, что аннотации безопасности не поддерживаются.

Edit2 После сообщения Изана я попробовал еще раз. Вот что у меня получилось:

@Webservice
@DeclareRoles(value = {"READ", "UPDATE", "DELETE"})
public class ServiceImpl implements Service {
  @Override
  @WebMethod(operationName = "helloWorld")
  @RolesAllowed({"NONE"})
  public String helloWorld() throws Exception {
     return "Hello World!";
  }
}

При такой настройке все могут получить доступ к методу, независимо от того, какие роли установлены. Пользователи проходят аутентификацию (это видно в audit.log), но авторизация не происходит. Как указано выше, я могу получить доступ к роли из WebServiceContext (я фактически делаю ручную авторизацию, используя эту информацию).

Добавление аннотации @Stateless позволяет мне использовать аннотации безопасности. Таким образом, @permitAll работает, как и ожидалось. Но использование ролей по-прежнему не работает, поскольку пользователи теперь не проходят аутентификацию. Они отображаются как ANONYMOUS в журнале аудита, и доступ им запрещен.

Мой web.xml выглядит так:



 OneMore

   
    WebServiceSecurity  

      
      Authorized users only  
      /service  
      POST
      

           
       READ
       UPDATE
       DELETE
      

   

 
    BASIC
 

 
    READ
 

 
    UPDATE
 

 
    DELETE
 

Glassfish-web.xml просто сопоставляет имена ролей с именами групп, вот так:


   READ
   READ

Edit 3. Благодаря Izan и бесчисленным попыткам я наконец-то добился того, что это работает.

Как уже говорилось, основным моментом был переход от обычного веб-сервиса к веб-сервису EJB путем добавления аннотации @Stateless. Это позволяет использовать аннотации безопасности.

Это изменение потребовало изменения дескрипторов развертывания. Если для первоначального веб-сервиса требовался glassfish-web.xml для настройки ролей, то после этого требуется glassfish-ejb-jar.xml.

6
задан TPete 7 March 2012 в 09:27
поделиться