2016-05-10 7 views
1

У меня есть веб-сервиса, как в следующем упрощенном примере, развернутого на JBoss EAP 6 (JBoss AS 7):Как вернуть правильный код состояния HTTP из проверки программной авторизации в JAX-WS Webservice?

@Stateless 
@RolesAllowed("basic_role") 
@WebService(name = "MyWebService", serviceName = "MyWebService") 
@WebContext(contextRoot = "api", urlPattern = "/MyWebService", authMethod = "BASIC") 
public class MyWebService { 

    @Resource 
    private WebServiceContext webServiceContext; 

    @WebMethod 
    public void doSomething(String parameter) { 
     System.out.println(webServiceContext.getUserPrincipal()); 
     if (!webServiceContext.isUserInRole("role_for_parameter_" + parameter)) { 
      throw new HTTPException(401); 
     } 
    } 
} 

Я хочу сделать проверку прав доступа на основании параметра передается, но я не знаю, как правильно вернуть код состояния 401. Если вызывающий абонент не предоставляет никаких учетных данных, или предоставленный пользователь не имеет «basic_role», сервер возвращает 401, как ожидалось. Но как только мой код вызывается, если я выкидываю какое-либо исключение, возвращается код состояния 500. Я думал, что это то, что для HTTPException было, но не имеет значения, использую ли HTTPException или RuntimeException или любое другое Исключение, которое я пытался.

Единственный способ, которым я мог придумать это:

@WebMethod 
public void doSomething(String parameter) { 
    System.out.println(webServiceContext.getUserPrincipal()); 
    if (!webServiceContext.isUserInRole("role_for_parameter_" + parameter)) { 
     HttpServletResponse response = (HttpServletResponse)webServiceContext.getMessageContext().get(MessageContext.SERVLET_RESPONSE); 
     try { 
      response.sendError(401, "Not authorized"); 
      throw new RuntimeException("Not authorized"); 
     } 
     catch (IOException e) { 
      throw propagate(e); 
     } 
    } 
} 

Таким образом, код 401 статуса возвращается, но мне нужно бросить исключение, а также для предотвращения дальнейшей обработки, и, кажется, из журналы, которые JAX-WS пытается вернуть 500 с RuntimeException, только это невозможно, потому что ответ уже завершен. Это не похоже на чистый способ сделать это.

ответ

1

Не уверен, что это лучший способ, но работает для меня:

webServiceContext.getMessageContext() 
    .put(MessageContext.HTTP_RESPONSE_CODE, HttpStatus.UNAUTHORIZED_401); 
return;