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

JSF Java Discussion :

j_security_check dans mon adresse ?!


Sujet :

JSF Java

  1. #1
    Membre averti
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut j_security_check dans mon adresse ?!
    Bonjour à tous,

    je voudrais mettre en place l'identification de mon application via Realm avec glassfish 3.1.2 mais je bloque sur un problème que je ne comprends pas trop.

    Je veux obliger l'identification lorsque l'on essaye d'accéder à une page du dossier test.
    Ma page de login se situe à la racine de mon site.

    Lorsque l'on affiche la page par exemple test/welcome.jsf, on arrive bien sur notre page login.jsf mais lors du clique sur le bouton pour se connecter, l'adresse renvoyée est : http://localhost:8080/Appli/test/j_security_check et la page login reste affichée...

    Qu'ai-je fait de maladroit ?

    Web.xml
    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
    57
    58
    59
    60
    61
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    	version="3.0">
    	<display-name>Appli</display-name>
    	<servlet>
    		<servlet-name>Faces Servlet</servlet-name>
    		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>Faces Servlet</servlet-name>
    		<url-pattern>*.jsf</url-pattern>
    	</servlet-mapping>
    	<context-param>
    		<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    		<param-value>client</param-value>
    	</context-param>
    	<context-param>
    		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    		<param-value>resources.application</param-value>
    	</context-param>
    	<listener>
    		<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    	</listener>
    	<!-- Security -->
    	<security-constraint>
    		<web-resource-collection>
    			<web-resource-name>PagesLogin</web-resource-name>
    			<description>
                 	Veuillez vous identifier.
                </description>
    			<url-pattern>/test/*</url-pattern>
    		</web-resource-collection>
     
    		<auth-constraint>
    			<role-name>roleuser</role-name>
    		</auth-constraint>
     
    		<user-data-constraint>
    			<transport-guarantee>NONE</transport-guarantee>
    		</user-data-constraint>
     
    	</security-constraint>
     
    	<login-config>
    		<auth-method>FORM</auth-method>
    		<realm-name>security</realm-name>
    		<form-login-config>
    			<form-login-page>/login.jsf</form-login-page>
    			<form-error-page>/login.jsf</form-error-page>
    		</form-login-config>
    	</login-config>
     
    	<security-role>
    		<description>Role user</description>
    		<role-name>roleuser</role-name>
    	</security-role>
    </web-app>
    glassfish-web.xml
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
    <glassfish-web-app error-url="">
    	<context-root>/Appli</context-root>
     
    	<class-loader delegate="true" />
    	<jsp-config>
    		<property name="keepgenerated" value="true">
    			<description>Keep a copy of the generated servlet class java code.</description>
    		</property>
    	</jsp-config>
     
    	<security-role-mapping>
    		<role-name>roleuser</role-name>
    		<group-name>USER</group-name>
    	</security-role-mapping>
     
    </glassfish-web-app>
    fichier.sql
    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
    create table usertable (
            username varchar(128) NOT NULL CONSTRAINT USER_PK PRIMARY KEY ,
            password varchar(128) NOT NULL
    );
     
    create table grouptable(
            username varchar(128) NOT NULL,
            groupid  varchar(128) NOT NULL,
            CONSTRAINT GROUP_PK PRIMARY KEY(username, groupid),
            CONSTRAINT USER_FK FOREIGN KEY(username) REFERENCES usertable(username)
                ON DELETE CASCADE ON UPDATE RESTRICT
        );
     
    insert into usertable(login,password) values ('toto', 'toto');
    insert into grouptable(username,groupid) values ('toto', 'USER');
    J'ai configuré le realm de glassfish comme ceci :
    Realm Name: security
    JAAS Context: jdbcReal
    JNDI: jdbc/derbyconnect
    User Table: usertable
    User Name Column: username
    Password Column: password
    Group Table: grouptable
    Group Name Column: groupid

    ps : je me sers du JNDI dans mon fichier de persistance et cela marche parfaitement avec ma base de données Derby.

    je vous remercie par avance.

  2. #2
    Membre Expert
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Par défaut
    en fait 'j_security_check' doit être juste après le nom du context

    http://www.foo.org/MonAppli/j_security_check

    or toi, elle est derrière "/test"

    montre ta page de login.


    après voici un morceau de code issu d'une de mes appli, qui permettent de mapper des bouton JSF (attribut action) vers des méthodes qui feront un forward vers j_security_check

    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
     
    import java.io.IOException;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.faces.context.ExternalContext;
    import javax.faces.context.FacesContext;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
     
    @ManagedBean
    public class LoginControler
    {
     
        private static final String SECURITY_LOGIN = "/j_security_check";
        private static final String SECURITY_LOGOUT = "/j_security_logout";
     
        public String getUser()
        {  
            return FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
        }
     
        public boolean isInRole(String role)
        {  
            return FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role);
        }
     
     
        private RequestDispatcher getDispatcher(ExternalContext ctx, String url)
        {   
            return ((ServletRequest) ctx.getRequest()).getRequestDispatcher(url);
        }
     
        private void doForward(String url) throws ServletException, IOException
        {
            ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
            RequestDispatcher dispatcher = this.getDispatcher(ctx, url);        
            dispatcher.forward((ServletRequest) ctx.getRequest(), (ServletResponse) ctx.getResponse());
            FacesContext.getCurrentInstance().responseComplete();
        }
     
        public String doLogin() throws IOException, ServletException
        {
            this.doForward(SECURITY_LOGIN);
            return null;
        }
     
        public String logOut() throws ServletException, IOException
        {
            this.doForward(SECURITY_LOGOUT);
            return null;
        }
    }
    tu peux alors mapper des h:commandButton vers "doLogin()" et "logOut()".

  3. #3
    Membre averti
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut
    merci pour ses précisions.

    login.xhtml
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core">
     
    <ui:composition template="/WEB-INF/templates/BasicTemplate.xhtml">
    	<ui:define name="content">
    		<form name="loginForm" method="post" action="j_security_check">
    			<h3>Espace d'identification</h3>
    			<h:panelGrid columns="2">
    				<h:outputLabel for="j_username">Login </h:outputLabel>
    				<h:inputText id="j_username" name="j_username" required="true" />
    				<h:message for="j_username" />
    				<br />
    				<h:outputLabel for="j_password">Password </h:outputLabel>
    				<h:inputSecret id="j_password" name="j_password" required="true" />
    				<h:message for="j_password" />
    			</h:panelGrid>
    			<br /> <input type="submit" name="submit" value="Login" />
    		</form>
    	</ui:define>
    </ui:composition>
    </html>
    J'avais déjà utilisé cela (dans Netbeans) sans managedBean (pour l'authentification) donc je suppose qu'il n'est pas obligatoire ?!

    J'ai mis une page de login-error et modifié mon web.xml :
    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>
    		<realm-name>security</realm-name>
    		<form-login-config>
    			<form-login-page>/login.jsf</form-login-page>
    			<form-error-page>/login-error.jsf</form-error-page>
    		</form-login-config>
    	</login-config>
    Et lorsque je m'identifie avec toto/toto, j'ai ma page d'erreur qui s'affiche avec toujours l'adresse http://localhost:8080/Appli/test/j_security_check

    J'ai suivi ce tutoriel plus ou moins pour le code de mon web.xml et de ma page login.

  4. #4
    Membre Expert
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Par défaut
    as-tu essayé le code que je t'ai donné ?
    c'est mieux.


    sinon au pire dans ton formulaire il suffit de rajouter (dynamiquement) le nom du contexte et la racine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <form action="#{request.contextPath}/j_security_check" >
    je te le redis "/j_security_check" ne doit être invoqué à la racine !

  5. #5
    Membre Expert
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Par défaut
    voici le formulaire de login qui va avec le ManagedBean que je t'ai donné plus haut ... y'a pas plus simple (en rouge, les points clés)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <h:form id="contentForm" prependId="false">
      <h:panelGrid columns="2" >
         <h:outputLabel value="Login" />
         <h:inputText id="j_username" />
      
       <h:outputLabel value="Password" />
       <h:inputSecret id="j_password" />
     </h:panelGrid>          
     <h:commandButton action="#{loginControler.doLogin()}"
                                value="Connexion !" />          
    </h:form>

  6. #6
    Membre averti
    Inscrit en
    Février 2012
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 39
    Par défaut
    Merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/01/2010, 21h31
  2. Mettre mon adresse mail dans mon site personnel ?
    Par Argenfrance dans le forum Débuter
    Réponses: 3
    Dernier message: 21/09/2008, 15h11
  3. Suppression de doublons dans mon carnet d'adresse
    Par gege87270 dans le forum Outlook
    Réponses: 1
    Dernier message: 26/11/2007, 12h26
  4. [MCD] Utilité d'une entité "Adresse" dans mon MCD ?
    Par korrigan dans le forum Schéma
    Réponses: 1
    Dernier message: 05/09/2007, 11h41
  5. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52

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