2010-07-27 6 views
0

J'utilise Apache Geronimo comme serveur d'application. Et l'authentification se passe via LDAP à l'aide d'Apache Directory Service. Je n'ai aucune expérience dans le développement de logiciels JavaEE, alors s'il vous plaît, soyez tranquille avec moi. Faites-moi savoir si j'ai besoin d'expliquer quelque chose plus en détail.Geronimo webapp utilisant l'authentification ldap

Fondamentalement, mon étape de connexion est assez similaire à cet exemple de la documentation geronimo: https://cwiki.apache.org/GMOxDOC22/ldap-sample-app-ldap-sample-application.html

Il y a trois comportements différents qui se produisent lorsqu'un utilisateur tente de se connecter:

  1. Lorsqu'un l'utilisateur se connecte avec le nom d'utilisateur correct, qui est dans le bon groupe LDAP, ils sont pris à une zone sécurisée du site. Et je ne suis pas sûr de savoir comment déconnecter l'utilisateur du site jusqu'à la fin de sa session. Lorsqu'un utilisateur se connecte avec un nom d'utilisateur/mot de passe qui ne figure pas dans le répertoire LDAP, l'utilisateur est redirigé vers /auth/logonError.html?param=test (cet emplacement est spécifié dans 'web.xml

  2. Lorsqu'un utilisateur se connecte avec un nom d'utilisateur/mot de passe correct qui n'est pas dans le groupe approprié, il est redirigé vers une "page interdite HTTP 403". Il y a un exemple de cette page au bas de l'échantillon ldap. Le comportement doit être identique à un utilisateur non authentifié. Dans tous ces cas, il n'y a aucun moyen pour l'utilisateur de réessayer le processus de connexion jusqu'à ce que le navigateur soit redémarré ou qu'un navigateur différent soit utilisé. C'est le gros problème que j'ai.

    Je voudrais que les scénarios suivants se produisent. Un utilisateur correctement authentifié peut se déconnecter et essayer de se connecter à nouveau.

  3. Un utilisateur incorrectement authentifié est redirigé vers l'écran de connexion et invité à réessayer.

Que dois-je faire pour que cela se produise? Merci de votre aide.

Répondre

0

Cela n'arrive pas toujours. Vous rencontrez un problème, luttez avec lui pendant quelques jours, enfin l'envoyer à StackOverflow (ou ailleurs), et vous résolvez le problème relativement facilement.

J'ai apporté quelques modifications à mon application qui ont résolu le problème. Je poste ce que j'ai fait au cas où quelqu'un trébucherait à travers ce problème de google avec un problème similaire.

D'abord, je créé un servlet (appelé EndSessionServlet) qui vient de faire ceci:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    endSession(request, response); 
} 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    endSession(request, response); 
} 

private void endSession(HttpServletRequest request, HttpServletResponse response) throws IOException{ 
    request.getSession().invalidate(); 
    response.sendRedirect("."); 
} 

Et puis j'ai ajouté à mon fichier web.xml:

<error-page> 
<error-code>403</error-code> 
<location>/EndSessionServlet</location> 
</error-page> 

Et j'ai aussi changé la forme -error-page dans le web.xml:

<login-config> 
<auth-method>FORM</auth-method> 
<realm-name>This is not used for FORM login</realm-name> 
<form-login-config> 
    <form-login-page>/login.jsp</form-login-page> 
    <form-error-page>/EndSessionServlet</form-error-page> 
</form-login-config> 
</login-config> 

Et j'ai ajouté un lien dans la section de la page Web qui est authentifié au EndSessionServlet. Ainsi, l'utilisateur authentifié peut maintenant se déconnecter correctement.

Pour les trois scénarios:

  1. L'utilisateur est capable de se connecter correctement, l'utilisateur clique sur le lien vers EndSessionServlet dconnecter
  2. L'utilisateur entre un nom d'utilisateur valide/mot de passe pour ldap, mais n'est pas dans la groupe correct. Cet utilisateur est normalement envoyé à la page 403, ce qui invalide la session et redirige vers la page de connexion.
  3. L'utilisateur entre un nom d'utilisateur/mot de passe invalide et est envoyé à, qui est également défini sur EndSessionServlet. Ceci termine la session et les redirige vers la page de connexion.

Tous les scénarios fonctionnent désormais correctement.