Bonjour,
je ne suis pas expert Spring, aussi ma question pourra paraître simpliste*. Mais si je ne la pose pas, ce sera pire, donc voici :
je travaille sur un portail web (principalement en JSF) dont l'authentification est gérée par spring security. Celle-ci fonctionne très bien. Elle est de la forme (simplifiée pour la lecture) :
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 <h:inputText id="j_username" name="j_username" type="text" value="#{user.login}"/> <h:inputSecret id="j_password" type="text" name="j_password" value="#{user.password}"/> <h:selectBooleanCheckbox id="_spring_security_remember_me" name="_spring_security_remember_me" value="#{user.rememberme}" class="float-left" /> <h:commandButton action="#{user.doLogin}"/>Cependant, l'utilisateur peut aussi se connecter au travers de liens fournis par des sites partenaires.
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 public final String doLogin() throws IOException, ServletException { final ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); final HttpServletRequest request = ((HttpServletRequest) context.getRequest()); final RequestDispatcher dispatcher = request.getRequestDispatcher("/j_spring_security_check"); dispatcher.forward(request, (ServletResponse) context.getResponse()); FacesContext.getCurrentInstance().responseComplete(); // It's OK to return null here because Faces is just going to exit. return null; }
Dans ce cas là, je passe par une servlet pour réaliser l'authentification, en supposant que les champs login et mot de passe seront codés dans la requête de la même façon.
Celà donne :
et dans la servlet
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="connexion"> <input id="j_username" name="j_username" type="text" value="Email" class="field"/> <input id="j_password" name="j_password" type="password" value="Mot de passe" class="field"/> <input type="button" class="btn" value="OK" onClick="javascript:register()"/> </form> function register(){ urlSite=http://localhost:8080/monApp/DistantLogingServlet?data= this.document.location=urlSite /*});*/ }
Hors, si je passe bien dans ma servlet, et si l'authentification est bien tentée, j'ai systématiquement une erreur de login/mdp. J'en déduis que les paramètres concernés ne sont pas transmis comme je le souhaitais.
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 /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) * @param request * @param response * @throws IOException * @throws ServletException */ protected final void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { final ExternalContext context = FacesUtils.getFacesContext( request, response, servletContext).getExternalContext(); final RequestDispatcher dispatcher = request.getRequestDispatcher("/j_spring_security_check"); dispatcher.forward(request, (ServletResponse) context.getResponse()); FacesContext.getCurrentInstance().responseComplete(); }
Je me demande donc de quelle manière réaliser ceci (j'ai la main sur le code inséré dans la page suivante, donc je peux le modifier à souhait, mais pas l'intégrer dans notre webapp).
J'avais éventuellement penser passer les login et mdp en base 64, mais je ne suis pas certain que ce soit ni "propre" ni sûr, et du reste je ne sais pas comment les transmettre à spring depuis la servlet...
Donc si quelqu'un a une idée, je suis tout ouïe!
* (je n'en ai cependant pas trouvé la réponse dans les FàQ)
Partager