IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

LTPA customiser les messages d'erreur de login avec "j_security_check"


Sujet :

Servlets/JSP Java

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut LTPA customiser les messages d'erreur de login avec "j_security_check"
    Hello les gens,
    J'aurais souhaité savoir par quel moyen il est possible d'afficher les erreurs se produisant lors du login d'un utilisateur (typiquement "nom d'utilisateur incorrect", "mot de passe incorrect" etc...)
    En partie mon web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <login-config>
    		<auth-method>FORM</auth-method>
    		<form-login-config>
    			<form-login-page>/login.jsp</form-login-page>
    			<form-error-page>/login.jsp</form-error-page>
    		</form-login-config>
    	</login-config>
    En partie la login.jsp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <FORM id="LoginForm" METHOD=POST ACTION="j_security_check"><font
    	size="1"> <strong> <bean:message key="page.user.login.enterCredentials" /></strong></font>
    <BR>
    <BR>
    <font size="1"><strong><bean:message key="page.user.login.Id" /></strong>
    <input id="userNameInput" type="text" size="12" name="j_username"></font>
    <font size="1"><strong><bean:message key="page.user.login.pwd" /></strong>
    <input type="password" size="12" name="j_password"></font> <BR>
    <font size="1"> <strong><bean:message key="page.user.login.connect" />
    </strong></font> <html:img styleClass="vertAlign"
    	src="/FacturationWeb/images/demiCercleGauche.png" /><a tabindex="0"
    	onmouseover="this.style.color='orange';"
    	onmouseout="this.style.color='white';" class="submitButtonLogin"
    	onclick="LoginForm.submit();return false"><bean:message
    	key="page.user.login.enter" /></a><html:img styleClass="vertAlign"
    	src="/FacturationWeb/images/demiCercleDroit.png" /></form>
    Quelqu'un propose une solution consistant à intércepter les erreurs en définissant une page d'erreur liée à l'erreur 401 mais qu'il qualifie "de son propre aveux" comme étend inadaptée
    Merci pour toutes vos contributions.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 241
    Points : 399
    Points
    399
    Par défaut
    Bonjour,

    si on se reporte à la specification servlet 2.4, je trouve les informations suivantes:
    • SRV.12.5.3 Form Based Authentication:
      5. If authentication fails, the error page is returned using either a forward or a redirect,
      and the status code of the response is set to 200.
      The error page sent to a user that is not authenticated contains information
      about the failure.
    • SRV.9.9.1 Request Attributes
      - les attributs de requêtes suivants doivent être positionnés:
      javax.servlet.error.status_code java.lang.Integer
      javax.servlet.error.exception_type java.lang.Class
      javax.servlet.error.message java.lang.String
      javax.servlet.error.exception java.lang.Throwable
      javax.servlet.error.request_uri java.lang.String
      javax.servlet.error.servlet_name java.lang.String


    En s'appuyant sur ces points, je t'invite à vérifier en début de JSP si ces attributs sont bien présents.

    Bon test,

    Sébastien

  3. #3
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    System.out.println(request.getAttribute("javax.servlet.error.status_code"));
    System.out.println(request.getAttribute("javax.servlet.error.exception_type"));
    System.out.println(request.getAttribute("javax.servlet.error.message"));
    System.out.println(request.getAttribute("javax.servlet.error.exception"));
    System.out.println(request.getAttribute("javax.servlet.error.request_uri"));
    System.out.println(request.getAttribute("javax.servlet.error.servlet_name"));
    Sont malheureusement tous à null

  4. #4
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Salut,

    Perso, je fais comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <login-config>
    	<auth-method>FORM</auth-method>
    	<form-login-config>
    		<form-login-page>/login.jsp</form-login-page>
    		<form-error-page>/login_error.jsp</form-error-page>
    	</form-login-config>
    </login-config>
    login_error.jsp ne faisant rien de plus que rediriger vers login.jsp, en passant un paramètre de plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <jsp:forward page="login.jsp">
    	<jsp:param value="true" name="loginError"/>
    </jsp:forward>
    Après sur le login, je joue sur la présence ou l'absence de ce paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <c:if test="${not empty param.loginError}">
      Le user ou/et le mot de passe sont erronés
    </c:if>

  5. #5
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    en passant un paramètre de plus :
    ok mais ça ne te renseigne pas sur ce qui c'est réelement passé

  6. #6
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    j'ai essayé de faire pareil:
    sur loginError.jsp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <logic:redirect page="/login.jsp">
    <html:param name="<%=ConstantsToto.HTTP_SERVLET_ERROR_LOGIN%>" value="true"/>
    </logic:redirect>
    sur login.jsp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <logic:present name="<%=ConstantsToto.HTTP_SERVLET_ERROR_LOGIN%>">
    			<layout:message key="Utilisateur et/ou mot de passe incorrect(s)"/>
    		</logic:present>
    Seulement le paramètre n'est visiblement jamais présent dans la requête

  7. #7
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Salut,

    C'est normal, que ce ne soit jamais vrai dans notre cas, il faudrait mettre:
    <logic:present parameter="leParametre"> pas name.

    ok mais ça ne te renseigne pas sur ce qui c'est réelement passé
    Pardon, je n'avais pas compris ce que tu voulais dire avant, mais je doute que ce soit faisable , savoir exactement ce qui s'est passé, "Le mot de passe est faux mais le user est bon".

    Bonne chance,

  8. #8
    Membre confirmé

    Inscrit en
    Juin 2005
    Messages
    1 155
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1 155
    Points : 475
    Points
    475
    Par défaut
    C'est normal, que ce ne soit jamais vrai dans notre cas, il faudrait mettre:
    <logic:present parameter="leParametre"> pas name.
    J'y ai effectivement fait attention, et bien que je fasse le changement le tag persiste à signifier que ce paramètre n'a aucune espèce d'existance au sein de l'objet request. J'aimerai bcp savoir pourquoi cela ne marche pas ??!?
    Pardon, je n'avais pas compris ce que tu voulais dire avant, mais je doute que ce soit faisable
    J'ai trouvé un code me permettant de produire exactement le comportement voulu:
    En gros je défini un filtre de servlet sur l'utilisation de l'url "j_security_check". Ensuite j'ai le moyen de savoir ce qui c'est réelement passé en parcourant la pile d'exception si la phase de login ne se déroule pas correctement
    Voici pour le principe, la partie code c'est une autre histoire, j'éspère que cela pourra être bénéfique à quelqu'un.
    Mon code provient des deux lien suivants:
    http://www.webservertalk.com/message1685868.html
    http://publib.boulder.ibm.com/infoce...rogramlog.html
    Mon filtre sur web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <filter>
    		<filter-name>LoginFilter</filter-name>
    		<display-name>LoginFilter</display-name>
    		<description>Performs pre-login and post-login operation</description>
    		<filter-class>com.package.nomProjet.common.util.LoginFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>LoginFilter</filter-name>
    		<url-pattern>/j_security_check</url-pattern>
    	</filter-mapping>
    	<filter-mapping>
    Ma classe LoginFilter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    public class LoginFilter implements Filter {
     
    	public void doFilter(
    		ServletRequest req,
    		ServletResponse resp,
    		FilterChain chain)
    		throws ServletException, IOException {
    		//ensure that HTTP Session is created. This is important. If I wait	until after the filter
    		//is called, the response may already be committed.
    		HttpSession tsession = ((HttpServletRequest) req).getSession();
     
    		chain.doFilter(req, resp);
     
    		//did login fail?
    		LastAuthenticationErrorHelper f = new LastAuthenticationErrorHelper();
    		if (f.wasLoginFailure()) {
    			HttpSession s = ((HttpServletRequest) req).getSession();
    			s.setAttribute("rootexc", f.getRootCause());
    			req.setAttribute(
    				ConstantsFacturation.HTTP_SERVLET_ERROR_LOGIN,
    				new Boolean(true));
    		}
    		HttpSession s = ((HttpServletRequest) req).getSession();
    		s.setAttribute(
    			ConstantsFacturation.HTTP_SERVLET_ERROR_LOGIN,
    			new Boolean(true));
    		//TODO Pour test. À enlever!
    	}
     
    	/* (non-Javadoc)
    	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
    	 */
    	public void init(FilterConfig arg0) throws ServletException {
    		// TODO Raccord de méthode auto-généré
     
    	}
     
    	/* (non-Javadoc)
    	 * @see javax.servlet.Filter#destroy()
    	 */
    	public void destroy() {
    		// TODO Raccord de méthode auto-généré
     
    	}
    }
    La classe LastAuthenticationErrorHelper:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class LastAuthenticationErrorHelper {
    	Throwable lastFailure;
     
    	public LastAuthenticationErrorHelper() {
    		final String func = "LastAuthenticationErrorHelper";
     
    		//did login fail?
    		lastFailure =
    			com.ibm.websphere.security.auth.WSSubject.getRootLoginException();
    	}
    	public boolean wasLoginFailure() {
    		return (lastFailure != null);
    	}
     
    	public Throwable getRootCause() {
    		return determineCause(lastFailure);
    	}
     
    		private Throwable determineCause(Throwable e) {
    		return LoginProcessing.determineCause(e);
    	}
    }
    La classe LoginProcessing :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public class LoginProcessing {
    	/* Méthode employée pour explorer en aval de WSLoginFailedException afin de recherche l'exception de "cause racine" */
     
    	public static Throwable determineCause(Throwable e) {
    		Throwable root_exception = e, temp_exception = null;
     
    		// continuer en boucle jusqu'à ce qu'il n'y ait plus d'exceptions 
    		// WSLoginFailedException ou WSSecurityException imbriquées 
    		while (true) {
    			if (e
    				instanceof com.ibm.websphere.security.auth.WSLoginFailedException) {
    				temp_exception =
    					((com
    						.ibm
    						.websphere
    						.security
    						.auth
    						.WSLoginFailedException) e)
    						.getCause();
    			} else if (
    				e instanceof com.ibm.websphere.security.WSSecurityException) {
    				temp_exception =
    					((com.ibm.websphere.security.WSSecurityException) e)
    						.getCause();
    			} else if (
    				e instanceof javax.naming.NamingException)
    				// rechercher l'exception imbriquée Ldap
    				{
    				temp_exception =
    					((javax.naming.NamingException) e).getRootCause();
    			}
    			/*else if (e instanceof your_custom_exception_here)
    			{
    					// votre traitement personnalisé ici, si nécessaire
    			}*/
    			else {
    				// cette exception n'est pas des types que nous recherchons,
    				// revenons en arrière, ceci est la racine de la perspective 
    				//  WebSphere Application Server
    				return root_exception;
    			}
    			if (temp_exception != null) {
    				// nous avons une exception ; revenons en arrière pour voir s'il y en a une
    				//  autre imbriquée dedans.
    				root_exception = temp_exception;
    				e = temp_exception;
    				continue;
    			} else {
    				// nous avons enfin l'exception racine de ce chemin d'appel, ce qui
    				// doit se produire à un certain stade
    				return root_exception;
    			}
    		}
    	}
     
    }
    Le souci c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.ibm.websphere.security.auth.WSSubject.getRootLoginException();
    retourne invariablement null même si les paramètres d'identification sont incorrects.
    En fait retourne null losque le login et/ou password sont null !!!
    En somme donc encore deux problème à résoudre:
    1- la tag 2- La méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getRootLoginException()
    de l'objet retourne constament null retourne parfois null

Discussions similaires

  1. Les messages d'erreur sur un Login
    Par zooffy dans le forum ASP.NET
    Réponses: 12
    Dernier message: 18/01/2008, 13h55
  2. Rediriger les messages d'erreur
    Par goblin dans le forum Langage
    Réponses: 3
    Dernier message: 25/12/2005, 20h04
  3. Réponses: 5
    Dernier message: 16/08/2005, 12h15
  4. [Message d'erreur] gérer les message d'erreurs
    Par heid dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2004, 14h57
  5. recuperer les messages d'erreurs de interbase
    Par devalender dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/06/2004, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo