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:
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:
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:
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 :
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
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 de l'objet retourne constament null retourne parfois null
Partager