AXOPEN

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. La sécurité s’effectue 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>

 <transport-guarantee>NONE</transport-guarantee>
 </user-data-constraint>
 </security-constraint>

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

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

Pour éviter ce problème, on peut récupérer dans la requestMap, l’information RequestDispatcher.FORWARD_REQUEST_URI. C’est dans cette variable que l’on va trouver l’URI réellement demandée par l’utilisateur. Ensuite, il suffit lors du clic sur le bouton login de rediriger l’utilisateur vers la page sauvegardée. Il est important de ne pas prendre en compte la page index.html pour éviter qu’en cas d’erreur de login, on perde l’information de l’URL initiale.

Trouver l’URL demandée par l’utilisateur

JSF redirect requested urlString 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 l’url sauvegardée et on redirige vers la bonne URL.

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