Printemps de Sécurité et d'Authentification JSON
J'ai une application au printemps/spring-mvc totalement utilise JSON communications.
Maintenant, j'ai besoin d'authentifier mon application avec spring security 3 (qui utilise LdapAuthenticationProvider) via JSON.
La valeur par défaut printemps seurity soumettre le formulaire nécessite un POST comme ceci:
POST /myapp/j_spring_security_check HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
Host: 127.0.0.1:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
j_username=myUsername&j_password=myPass
Mais je veux passer un objet JSON comme ceci:
{"j_username":"myUsername","j_password":"myPass"}
J'ai lu beaucoup de post comme cette, cette autre ou cette une sans la chance, dans tous ajax cas est fait un POST comme ci-dessus.
Des Idées?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez écrire votre propre filtre de sécurité qui va analyser votre JSON.
http://docs.spring.io/spring-security/site/docs/3.0.x/reference/core-web-filters.html
Vous pouvez utiliser le BasicAuthenticationFilter comme une référence:
http://docs.spring.io/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/www/BasicAuthenticationFilter.html
Selon Kevin suggestions,
et après la lecture de ce messages: Un, Deux, la documentation Trois, et grâce à cette blog,
J'ai écrit mes propres FORM_LOGIN_FILTER de gérer directement JSON avant l'authentification.
Je colle mon code pour la communauté.
L'objectif est de donner à la fois le classique navigateur POST de formulaire d'authentification avec JSON en fonction d'authentification. Aussi en JSON authentification je veux éviter de le rediriger vers loginSuccesful.htm
En contexte:
CustomUsernamePasswordAuthenticationfilter classe:
CustomAuthenticationSuccessHandler classe:
Si vous voulez juste différent du corps de la requête de l'analyseur pour la demande de connexion juste étendre
UsernamePasswordAuthenticationFilter
et remplacerattemptAuthentication
méthode.Par défaut
UsernamePasswordAuthenticationFilter
va analyser url encodé les données et créer desUsernamePasswordAuthenticationToken
d'elle. Maintenant, vous avez juste besoin de faire parser qui va analyser tout ce que vous envoyez à l'application.Ici est un exemple qui va analyser
{"username": "someusername", "password": "somepassword"}
Dans l'extrait du corps de la requête est extrait à la chaîne et mappé pour objet
AuthReq
(@Data
annotation est de lombok lib, il va générer seters et getters).Que vous pouvez faire
UsernamePasswordAuthenticationToken
qui sera transmise à défautAuthenticationProvider
.Maintenant, vous pouvez étendre
WebSecurityConfigurerAdapter
et remplacer cnofigure méthode pour remplacer l'ancien filtre.Avec
addFilterAt
méthode que vous remplacez par défautUsernamePasswordAuthenticationFilter
. N'oubliez pas d'utiliser@EnableWebSecurity
annotation.Une autre façon, selon cette post, est de gérer manuellement le printemps de l'authentification de sécurité directement dans le Contrôleur.
De cette manière, est très simple à gérer JSON d'entrée et éviter de login redirect:
J'ai appliqué les réponses de fl4l et oe.elvik pour la connexion avec JSON informations d'identification dans un Printemps de Démarrage de l'application. Je suis en train de travailler avec l'annotation à base de haricots de configuration.
En référence réponses, un filtre personnalisé est créé, dans lequel le gestionnaire d'authentification est injecté. Pour ce faire, le gestionnaire d'authentification doit être présent comme un Ressort de Haricot. Voici un lien sur la façon de le faire: https://stackoverflow.com/a/21639553/3950535.
Regardez cet exemple: https://github.com/fuhaiwei/springboot_security_restful_api
Ici est la java de configuration pour les solutions ci-dessus: