Authentification par formulaire en jsp

La spec jsp prévoit la possibilité de définir une page html pour l’authentification en lieu et place de la popup de logging du navigateur. Pour cela, il suffit de concevoir un formulaire comme ceci :

form method="post" action="j_security">
<input type="text" name="j_username"/>
<input type="password" name="j_password"/>
</form>

Parfait, il est donc possible de personnaliser la fenêtre de logging et de la fondre dans le design général de l’application ; tout en bénéficiant d’une authentification déclarative assurée par le « container » cad le moteur de servlet.

Seulement voilà :

Comment permettre une authentification active des utilisateurs (on se logue volontairement ; on n’est pas contraint de montrer patte blanche seulement après avoir tenté d’accéder à une zone sécurisée) ?
Comment implementer une option « remember me » (l’application dispense l’utilisateur de ressaisir son login et mot de passe systématiquement) ?

C’est impossible !

Si l’on tient à ces fonctionnalités, il nous faut alors laisser tomber l’authentification par container et développer une authentification « custom » à base de ServletFilter et renoncer par la même occasion aux methodes HttpServletRequest.getRemoteUser et HttpServletRequest.isUserInRole.
Tout ceci ne facilitera pas une éventuelle intégration SSO, mais bon, quand le standard est mauvais ou incomplet…

7 Commentaires

  1. HI

    j’aimerai m’authentifier a cette page jsp.
    Est-ce possible avec une classe java ??
    Si oui, auriez vous le code s’il vous plait ?
    merci

  2. HI

    J’espere qu’il va s’afficher cette fois ci … [JS] [JS] [JS]

  3. HI

    A la place des balises des [] … [input type= »text » name= »login » maxlength= »8″ value= » » style= »width=50% »] [input type= »password » name= »password » maxlength= »4″ value= » » style= »width=50% »] [input type= »submit » name= »valider » value= »VALIDER » onclick= »doSubmit() » class= »submit » title= »VALIDER »]

  4. Florent Garin Author

    En admettant que ton formulaire définisse un attribut de type action= »/zone_protegee/index.jsp ». Tu dois déclarer au niveau du web.xml un filtre avec un mapping du genre « /zone_protegee/* ».

    Ton filtre ressemblera à peu près à ça:

    public class AuthFilter implements Filter {

    public AuthFilter() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {

    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    HttpSession session = httpRequest.getSession();
    Account account = (Account) session.getAttribute(« account »);
    try {
    String login=request.getParameter(« login »);
    String password=request.getParameter(« password »);

    //ce if sert à n’authentifier que si l’utilisateur vient de soumettre son login et password. Pour ne pas interférer avec d’autre formulaire il faudrait renommer le champ submit en « login ».
    if(« VALIDER ».equals(request.getParameter(« valider »))){
    //on lance l’authentification qui pourra requêter dans une BD ou encore mieux s’appuyer sur JAAS
    //si l’authentification échoue Tools.authenticate lancera une exception, on se retrouvera donc dans le bloc catch
    account = Tools.authenticate(login, password);
    session.setAttribute(« account », account);
    //l’authentification s’est bien déroulée, l’utilisateur accède alors à la page souhaitée.
    chain.doFilter(request, response);
    } else if (account == null) {

    //l’utilisateur n’est pas authentifié on le redirige vers la page principale pour qu’il puisse le faire.
    httpResponse.sendRedirect(« /index.jsp »);
    }else
    //l’utilisateur est déjà authentifié et n’a pas tenté de changer de compte.
    chain.doFilter(request, response);
    } catch (Exception pEx) {
    //l’utilisateur a essayé de s’authentifier sans succès.
    throw new ServletException(« Bad login or password. », pEx);
    }
    }

    public void destroy() {
    }

    public void init(FilterConfig filterConfig) {
    }

  5. I may need your help. I tried many ways but couldn’t solve it, but after reading your article, I think you have a way to help me. I’m looking forward for your reply. Thanks.

  6. Thanks for sharing. I read many of your blog posts, cool, your blog is very good. https://accounts.binance.com/tr/register-person?ref=JHQQKNKN

  7. Your point of view caught my eye and was very interesting. Thanks. I have a question for you.

Comments are closed.