6
votes

Comment forcer la sécurité de printemps oauth 2 pour utiliser Json au lieu de XML?

J'ai créé une application de printemps MVC et mettre en place la sécurité de printemps OAuth 2. Tout en appelant des méthodes de ma courroi, je reçois XML:

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


0 commentaires

4 Réponses :


8
votes

Pour la sécurité du printemps, les exceptions OAuth sont rendues à l'aide de la valeur par défautOauth2ExceptionRenderer

Il convient de faire correspondre l'en-tête HTTP reçu reçu contre les messageconsvers fournis. Dans votre cas, il semble que Spring Boot ait automatiquement attribué XML et JSON Messageconverters. Ce comportement est confirmé que sur la base de l'en-tête accepté, vous recevez l'exception rendue dans un type de contenu approprié

sans l'en-tête d'acceptation defaultoauth2exceptionRenderer par défaut sur le Accepter: * et le premier messageconverter habituellement pour répondre est XML One.

Si XML est indésirable dans votre application, vous devrez voir pourquoi il devient pris en charge (le plus probablement, vous avez un FasterXML Jackson dans You ClassPath).

Si vous souhaitez prendre en charge les deux mais que vous souhaitez que JSON par défaut, cela vous obligera à écrire votre propre implication de la oauth2exceptionRendrer et assurez-vous que des exceptions sont rendues dans JSON. Encore une meilleure approche consisterait à accrocher votre IPL au contentnegotationManager et déléguer la résolution médiatisype de médiation.

Pour plus d'informations sur contentnegotationManager Vérifiez ce lien:

https://spring.io/blog/ 2013/05/11 / contenu-négociation-utilisation-spring-mvc


0 commentaires

2
votes

SET Accepter: Application / JSON comme attribut d'en-tête


0 commentaires

0
votes

Il est très facile de forcer oauth2, il vous suffit de comprendre vous-même par vous-même:

@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());
        }
    };
}


0 commentaires

1
votes

Pour développer la réponse de Bigdong, vous n'avez pas besoin de créer vos propres classes d'entrée et de gestionnaire d'exception, il vous suffit de remplacer le rendu et de définir le type de convertisseurs de messages que vous souhaitez utiliser. Par exemple, dans mon oauth2config, je fais ce qui suit: xxx

où le rendu est créé avec les convertisseurs de messages que je veux: xxx

enfin instancier Le gestionnaire de points d'entrée et d'erreur et définissez le rendu: xxx


0 commentaires