2017-10-06 1 views
0

Configuration:Spring Boot et sécurité: comment étendre la réponse pour le code d'état 302?

  • l'application Boot Spring
  • sécurité OAuth2
  • ReactJS pour la mise en œuvre de l'interface utilisateur

utilisation:

  • Connectez-vous à l'application
  • ouvrir un autre onglet avec la même application dans un même navigateur
  • Déconnexion de l'application dans l'un des onglets, l'utilisateur est redirigé vers Connexion vue
  • Aller au premier onglet (utilisateur déjà déconnecter et si je rafraichir la page j'obtenir connexion formulaire) et effectuer une action qui déclenche la requête POST/PUT/PATCH. Exemple de demande et la réponse ci-dessous:

Demande:

Request URL:http://localhost:8080/api/info 
Request Method:PUT 
Status Code:302 Found 
Remote Address:[::1]:8080 
Referrer Policy:no-referrer-when-downgrade 
accept:application/json 
Accept-Encoding:gzip, deflate, br 
Accept-Language:en-US,en;q=0.8,sv;q=0.6,ru;q=0.4,uk;q=0.2,fr;q=0.2 
Cache-Control:no-cache 
Connection:keep-alive 
Content-Length:66 
Content-Type:application/json 
Cookie:_ga=GA1.1.1868465923.1505828166; _gid=GA1.1.612220229.1507272075; session=e4oSW4Kq; prod_user_session=4d6b615f-521704; user_session=g3ggLxJDomyZ 
Host:localhost:8080 
mode:cors 
Origin:http://localhost:8080 
Pragma:no-cache 
Referer:http://localhost:8080/profile 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 

Réponse:

Cache-Control:no-cache, no-store, max-age=0, must-revalidate 
Connection:keep-alive 
Content-Length:0 
Date:Fri, 06 Oct 2017 12:12:26 GMT 
Expires:0 
Location:http://localhost:8080/login 
Pragma:no-cache 
X-Content-Type-Options:nosniff 
X-Frame-Options:DENY 
X-XSS-Protection:1; mode=block 

Après ce système de réponse déclenche la demande de mise à http://localhost:8080/login et échoue parce que la méthode PUT pas permis pour http://localhost:8080/login demande.

Question:

Je comprend que je reçois 302 et le statut Location:http://localhost:8080/login tête parce que je suis déjà déconnecté. Je veux étendre la réponse pour ce cas avec le corps JSON ou au moins m'assurer que pour ce cas j'obtiendrai le code d'état 401 Unauthorised au lieu de 302.

Répondre

1

Si j'ai bien compris votre question, il semble que vous ayez besoin de deux réponses différentes pour des demandes non autorisées venant via un chargement de page Web classique() vs un appel AJAX (produces="application/json"). Actuellement, votre appel AJAX non autorisé est redirigé vers la page de connexion qui est une page légitime, donc pas de code de réponse 401. Voici un exemple d'une configuration qui accomplit ce que vous voulez en utilisant configs XML Spring Security Ajax login et @Configuration config https://stackoverflow.com/a/27300215/1718213

Une autre option qui est encore plus convivial est d'utiliser le support de WebSocket de printemps pour signaler des événements de déconnexion à tous les onglets un utilisateur donné peut avoir ouvert (sur tous les appareils et les navigateurs) qui déclencherait la redirection de chaque onglet vers la page de connexion.