JSF – Rediriger après le login vers la page demandée (security-domain)

En cas d’accès à une page JSF sans être connecté avec les contraintes de sécurité JAAS, le système va rediriger l’utilisateur vers la page de login
Pierre LISERONMis à jour le 27 Juin 2014

En cas daccès à une page JSF  sans être connecté avec les contraintes de sécurité JAAS, le système va rediriger lutilisateur vers la page de login. La sécurité seffectue généralement avec le web.xml de la manière suivante:

<security-constraint>
 <web-resource-collection>
 <web-resource-name>SecuredContent</web-resource-name>
 <url-pattern>/secure/*</url-pattern>
 <http-method>GET</http-method>
 <http-method>POST</http-method>
 </web-resource-collection>
 <auth-constraint>
 <role-name>1</role-name>
 </auth-constraint><a href="/2014/06/JSF_redirect_requested_url.jpg"></a>
 <transport-guarantee>NONE</transport-guarantee>
 </user-data-constraint>
 </security-constraint>

Le problème est que lors de laccès à la page de login, on perd linformation de la véritable page demandée par lutilisateur. Ce qui est problématique si lon souhaite redirigée correctement lutilisateur suite à la connexion. Par exemple, le cas typique est un lien dans un e-mail redirigeant vers une page précise de lapplication / site qui est dans un espace sécurisé. A laccès à la page (en GET), la sécurité va rediriger lutilisateur sur la page de login et on souhaite une fois connecté pouvoir envoyer lutilisateur sur la véritable page du lien contenu dans le-mail.

Une solution simple à mettre en place consiste à créer une petite fonction quon appel au début de la page de login qui va stocker lURLUniform Ressource Locator demandée lors de la redirection vers la page de login. Si on utilise directement getRequestUrl() sur lexternatcontext(), on va avoir index.xhtml et non pas la bonne URL.

Pour éviter ce problème, on peut récupérer dans la requestMap, linformation RequestDispatcher.FORWARD_REQUEST_URI. Cest dans cette variable que lon va trouver lURI réellement demandée par lutilisateur. Ensuite, il suffit lors du clic sur le bouton login de rediriger lutilisateur vers la page sauvegardée. Il est important de ne pas prendre en compte la page index.html pour éviter quen cas derreur de login, on perde linformation de lURL initiale.

Trouver lURL demandée par lutilisateur 
jsf-redirect-requested-url

String lRequestedUrl = (String) FacesContext.getCurrentInstance()
  
.getExternalContext().getRequestMap()
  
.get(RequestDispatcher.FORWARD\_REQUEST\_URI);
  
if (lRequestedUrl != null && !lRequestedUrl.endsWith(« index.xhtml »)) {
  
mRequestedUrl = lRequestedUrl;
  
}

Lors du login

On teste lurl sauvegardée et on redirige vers la bonne URL.

if (mRequestedUrl != null && !mRequestedUrl.endsWith(« index.xhtml »)) {
  
return mRequestedUrl;
  
} else {
  
return « home »;
  
}