2

Я создал приложение Spring MVC и настроить Spring Security OAuth 2. Хотя методы, требующие от моего Брауэр я получаю XML:Как заставить Spring Security OAuth 2 использовать JSON вместо XML?

<oauth> 
    <error_description> 
     Full authentication is required to access this resource 
    </error_description> 
    <error>unauthorized</error> 
</oauth> 

браузер посылает следующий заголовок:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

Когда Я установил json accept header, я получаю JSON. Мне нужно заставить мой сервер авторизации всегда отправлять JSON. Не нашли решения. Благодарю.

ответ

5

Для исключения OAuth Spring Security при визуализации с использованием DefaultOAuth2ExceptionRenderer

Это будет соответствовать принятому заголовку Accept HTTP против предоставленных MessageConverters. В вашем случае кажется, что Spring Boot автоматически назначил XML и JSON MessageConverters. Такое поведение подтверждается, что на основании заголовка Accept вы получаете исключение вынесенное в надлежащем Content-Type

Без заголовка Accept DefaultOAuth2ExceptionRenderer по умолчанию в Accept: * и первый MessageConverter обычно отвечать является XML один.

Если XML нежелателен в вашем приложении, вам нужно будет понять, почему он поддерживается (скорее всего, у вас есть FasterXML Jackson в вашем пути к классам).

Если вы хотите поддерживать, но хотят иметь JSON по умолчанию, что потребует от вас, чтобы написать свой собственный осущ в OAuth2ExceptionRendrer и убедитесь, что исключения получить вынесенное в формате JSON. Еще лучше было бы подключить ваш impl к ContentNegotationManager и делегировать ему разрешение MediaType.

Для получения дополнительной информации о ContentNegotationManager Проверить эту ссылку:

https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

2

Установите Accept: application/json как атрибут заголовка

+0

Отлично ... это сработало. –

0

Это очень легко заставить oauth2, вам просто нужно, чтобы понять это самостоятельно первых:

@Autowired 
private AuthenticationEntryPoint authenticationEntryPoint; 

@Autowired 
private AccessDeniedHandler accessDeniedHandler; 

@Override 
public void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
      .anyRequest() 
      .access("#oauth2.hasScope('read')") 
     .and() 
      .exceptionHandling() 
      .authenticationEntryPoint(authenticationEntryPoint) 
      .accessDeniedHandler(accessDeniedHandler); 
} 

Тогда вы будете n ПЕД создать AuthenticationEntryPoint и accessDeniedHandler @Bean

@Bean 
public AccessDeniedHandler accessDeniedHandler() { 
    return new AccessDeniedHandler() { 
     @Override 
     public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException { 
      response.getWriter().append("\"FORBIDDEN\""); 
      response.setStatus(HttpStatus.FORBIDDEN.value()); 
     } 
    }; 

} 

@Bean 
public AuthenticationEntryPoint authenticationEntryPoint() { 
    return new AuthenticationEntryPoint() { 
     @Override 
     public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { 
      response.getWriter().append("\"UNAUTHORIZED\""); 
      response.setStatus(HttpStatus.UNAUTHORIZED.value()); 
     } 
    }; 
} 

Вы можете конвертировать в формат JSON, как вам нравится, я бы порекомендовал вам Джексоном.

Смежные вопросы