Angular.js et Spring Security

Il y a déjà quelques temps, Olivier Croisier nous initiait à Angular.js via une application Spring MVC. Question dans les commentaires : comment sécuriser ce type d’application ?

Spring Security

En général, j’essaie de ne pas réinventer la roue, surtout quand il s’agit de sécurité. Ici, puisque l’application se base sur Spring, Spring-Security me semble la solution la plus indiquée.

J’ai commencé par configurer mon serveur grâce à la méthode RTHM (Read The Holy Manual). Spring stocke un id de session chez le client et l’état sur le serveur (il faut bien faire quelques concessions, todo.ng n’est plus complètement stateless).

Notre application s’attend à recevoir les informations de connexion via un formulaire. Après vérification de la validité du login/mdp, il renvoie au client une redirection vers la page correspondante (failed ou success). C’est ce mécanisme de redirect qu’il va falloir remplacer, et cela se fait très facilement.

J’ai forké (du verbe forker : je fork, tu forks, il fork,..) l’application d’Olivier pour lui ajouter ce nouveau comportement. Je vous passe les détails de configuration de Spring-security, le manuel est bien plus bavard et précis que moi. Intéressons-nous plutôt à ce morceau de context-security.xml :

<http auto-config='true' entry-point-ref="authenticationEntryPoint">
<form-login authentication-success-handler-ref="ajaxAuthenticationSuccessHandler"
            authentication-failure-handler-ref="ajaxAuthenticationFailureHandler"/>
<logout success-handler-ref="ajaxLogoutSuccessHandler" />
</http>

<beans:bean id="authenticationEntryPoint" 
     class="net.thecodersbreakfast.todo.security.Http401DeniedEntryPoint"/>
<beans:bean id="ajaxAuthenticationSuccessHandler" 
     class="net.thecodersbreakfast.todo.security.AjaxAuthenticationSuccessHandler"/>
<beans:bean id="ajaxAuthenticationFailureHandler" 
     class="net.thecodersbreakfast.todo.security.AjaxAuthenticationFailureHandler"/>
<beans:bean id="ajaxLogoutSuccessHandler" 
     class="net.thecodersbreakfast.todo.security.AjaxLogoutSuccessHandler"/>

L’entryPoint définit l’objet qui est appelé si l’on veut accéder à une ressource interdite. Et comme leurs noms l’indiquent, chaque handler traite une situation du processus : le login réussit, le mauvais login et le logout.

Le paramètre auto-config gère le reste : les URLs à appeller pour se connecter sont celles par défaut :

S’authentifier : POST(‘j_spring_security_check’, username/password, content-type=x-www-form-urlencoded)

Se déconnecter : GET(j_spring_security_logout)

J’ai donc définit mes propres handlers, qui renvoient un statut 200 en cas de connexion réussie, 403 si le login/mdp est invalide et 401 si on essaye d’accéder à une ressource interdite.

Il ne reste plus qu’à sécuriser les URLs, et plus finement, les controllers : @PreAuthorize devrait vous y aider.

Angular.js

Je vous laisse découvrir ici le controller Angular.js qui gère ces appels. Rien de bien sorcier.

Test

Pour tester le bon fonctionnement de l’application, on ne va autoriser la création d’entrées Todo qu’aux personnes connectées. J’ai donc ajouté une annotation @PreAuthorize au dessus du handler correspondant, dans TodoController (il faut penser à activer les annotations security et ajouter les modules AOP de Spring).

L’identifiant est ‘rod’, mot de passe ‘koala’ (comme dans la doc de Spring)

Dorénavent, seul les personnes connectées peuvent créer des Todo.

 

Source : Un monsieur en parlait avant moi, et en anglais ici (http://gal-levinsky.blogspot.fr/2011/08/spring-security-3-ajax-login.html)

[1] Oui, le mot de passe est envoyé en clair au serveur, mais cela suffit pour le type de service que je développe.

VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share

À propos de Hugo Cordier

Suivez moi sur Twitter @HugoCrd
Ce contenu a été publié dans Non classé. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire