Connexion JSF / Java EE sans avoir besoin d'une ressource protégée


Dans une application Web JSF2 / Java EE 6 utilisant la sécurité gérée par conteneur, l'authentification basée sur le formulaire (j_security_check) nécessite qu'une page protégée soit demandée, après quoi le conteneur gère le processus de connexion pour vous, redirigeant le navigateur vers la page demandée une fois authentifié.

Il existe de nombreux scénarios courants où ce n'est pas ainsi que vous voulez que votre application se comporte. Par exemple, vous pouvez avoir une version en lecture seule et une version pouvant être mise à jour de la même page. Vous pourriez mettre un "login maintenant bouton" modifier " sur la page si l'utilisateur n'est pas connecté, et les champs modifiables si l'utilisateur est connecté. Mais c'est la même page JSF dans les deux situations, et cette vue ne peut pas être à la fois non protégée et protégée, donc j_security_check ne semble pas gérer ce scénario.

Donc, deux questions:

1) j_security_check peut-il être manipulé pour atteindre cette fonctionnalité? ou 2) Quelle est la façon "normale" dont les webapps JSF / JavaEE y parviennent si j_security_check ne peut pas?

Author: user815806, 2012-11-28

1 answers

L'utilisateur connecté est également disponible dans les pages non sécurisées. Vous pouvez simplement effectuer une vérification connectée en vérifiant la présence de HttpServletRequest#getRemoteUser() et une vérification de rôle par HttpServletRequest#isUserInRole() et rendre les composants restreints en conséquence.

Par exemple, afficher le bouton" connexion pour modifier " uniquement lorsque l'utilisateur n'est pas connecté:

<h:commandButton 
    value="Login to edit" action="#{auth.login}" 
    rendered="#{empty request.remoteUser}" />

Et montrer bouton "modifier" uniquement lorsque l'utilisateur est connecté, ou a le rôle souhaité:

<h:commandButton 
    value="Edit" action="#{someBean.edit(someItem)}" 
    rendered="#{not empty request.remoteUser}" />
<!-- or -->
<h:commandButton 
    value="Edit" action="#{someBean.edit(someItem)}" 
    rendered="#{request.isUserInRole('ADMIN')}" />
 1
Author: BalusC, 2012-11-28 12:49:34