2014-09-01 1 views
0

Я являюсь bulid rest api, используя jax-rs. Для обработки аутентификации я использую Interceptor. Когда авторизация не удалось мне вернуть WebApplicationException как:jaxrs - ошибка срабатывает в статусе возврата перехватчика 500

try 
     { 
     Authentication authentication = authenticationManager 
       .authenticate(new UsernamePasswordAuthenticationToken(policy.getUserName(), policy.getPassword())); 
     SecurityContext securityContext = SecurityContextHolder.getContext(); 
     securityContext.setAuthentication(authentication); 
     } 
     catch (AuthenticationServiceException | BadCredentialsException e) 
     { 
     throw new WebApplicationException(Response.Status.UNAUTHORIZED); //TODO set response status 
     } 

но он возвращает startus 500 вместо 401.

Когда я бросить WebApplicationExceptions в сфере услуг это возвращающие статусы, которые я установил, но в перехватчик он не работал. Как вернуть 401 из перехватчика?

jaxrs: сервер конфигурации:

<jaxrs:server id="restService" address="/rest"> 
    <jaxrs:serviceBeans> 
     <ref bean="serviceBean"/> 
    </jaxrs:serviceBeans> 
    <jaxrs:inInterceptors> 
     <ref bean="securityInterceptor"/> 
    </jaxrs:inInterceptors> 
</jaxrs:server> 

<bean id="serviceBean" class="some_package.CustomerService"/> 

<bean id="securityInterceptor" class="some_package.AuthenticatorInterceptor"/> 
+0

Я не уверен, но, возможно, для проверки подлинности вы должны использовать фильтры вместо перехватчиков. – mkrakhin

+0

@mkrakhin Я пробовал с фильтрами, но у меня есть jsr311-api в версии 1.1.1, это не сработало, и я не могу перейти на последнюю версию. –

ответ

0

Ваш перехватчик вызывается до ресурса JAX-RS называется, что означает, что он не знает об установке JAX-RS еще.

Я бы использовал ExceptionMapper для преобразования в соответствующий отклик, независимо от того, откуда его выбрасывают.

+0

Я создаю Mapper с аннотацией @Provider, добавляю конфигурацию в xml, добавляю в список поставщиков jaxrs: server, но он не срабатывает, когда я делаю исключение. –

1
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.Status; 
import javax.ws.rs.ext.Provider; 

@Provider 
public class Example implements ContainerRequestFilter { 
    @Override 
    public void filter(ContainerRequestContext requestContext) { 
     requestContext.abortWith(Response.status(Status.UNAUTHORIZED).build()); 
    } 
} 
Смежные вопросы