Comment stocker une URL rejetée par un filtre de sécurité, pour y accéder après la connexion de l'utilisateur
-
19-08-2019 - |
Question
J'utilise la sécurité gérée par application pour une application Web Intranet.
J'ai le filtre suivant dans mon fichier web.xml:
<filter>
<filter-name>employeeAccessFilter</filter-name>
<filter-class>security.AuthorizationFilter</filter-class>
<init-param>
<param-name>roles</param-name>
<param-value>employee</param-value>
</init-param>
<init-param>
<param-name>onError</param-name>
<param-value>../index.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>employeeAccessFilter</filter-name>
<url-pattern>/corporate/*</url-pattern>
</filter-mapping>
index.html contient une zone de connexion. Lorsqu'un utilisateur se connecte, il accède au tableau de bord de l'intranet. Le filtre fonctionne bien.
Jetez un coup d'œil à la situation suivante:
- Quelqu'un reçoit un email avec une page intranet, tel que: http: // appname .com / corporate / page.do? id = 6
- Il clique sur le lien. Un cookie est stocké dans son navigateur par défaut. Il est automatiquement connecté et la page s'affiche correctement.
Mais:
- Quelqu'un reçoit un courrier électronique contenant un lien vers une page intranet, tel que: http: // appname .com / corporate / page.do? id = 6
- Il clique sur le lien. Son navigateur par défaut ne contient pas de cookie d'application. Il n'est donc pas automatiquement connecté. Il est redirigé vers l'écran de connexion. Il se connecte mais il accède au tableau de bord au lieu de la page mentionnée dans le lien.
Existe-t-il un moyen simple de résoudre ce problème?
J'ai essentiellement deux idées:
B) - Utilisez Basic - sécurité gérée par conteneur qui résoudra le problème.
A) - Implémenter dans le filtre d'authentification un mécanisme qui stocke l'URL rejetée en tant qu'attribut de demande. - Mettez l'URL rejetée comme un champ caché de la boîte de connexion. - Modifiez la logique de connexion pour utiliser le champ url au lieu de toujours tableau de bord.
Les deux semblent être un peu de travail? Quelqu'un a une meilleure idée?
La solution
La plupart des sites nécessitant une connexion semblent le faire à l'aide de la méthode A. Par exemple, en cas de dépassement de pile, si vous accédez à une page nécessitant une connexion, vous êtes redirigé vers / users / login? returnurl = ...
, ce qui provoque l'émission d'un champ returnurl
en tant que champ caché dans le formulaire de connexion.