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 :

Problème synchro menu dynamique selon user connecté


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut Problème synchro menu dynamique selon user connecté
    Bonjour,

    J'aimerais créer un menu dynamique selon l'utilisateur connecté (avec des droits d'accès à certaines pages).
    J'ai donc une page de login, une page Template (avec un haut de page, menu, bas de page et contenu central)

    J'ai également un filtre pour obliger que l'utilisateur se logue pour avoir accès aux pages de l'application.
    Tout fonctionne bien si l'utilisateur affiche en premier la page de login qui le redirigera sur la page d'accueil.
    Par contre, si l'utilisateur affiche en premier la page d'accueil, le filtre le redirige sur la page de login et ensuite la page de login sur la page d'accueil.

    Le problème est que dans le ManagedBean de construction de mon menu, dans la méthode init(@PostConstruct) je récupère l'utilisateur chargé dans la session pour savoir s'il est administrateur ou pas.
    Et dans le cas d'un appel à la page d'accueuil avant la page de login, la méthode de construction du menu est appelée avant d'avoir pu enregistré l'utilisateur dans la session (qui se fait dans la page de login).

    ManagedBean du menu :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
     
    @ManagedBean
    @SessionScoped
    public class MenuView2 {
     
        private static final String ID_UPDATE = "messages";
     
        private MenuModel menuModel;
     
        @PostConstruct
        public void init() {
            menuModel = new DefaultMenuModel();
     
            FacesContext context = FacesContext.getCurrentInstance();
    		ExternalContext externalContext = context.getExternalContext();
    		HttpSession session = ((HttpServletRequest) externalContext.getRequest()).getSession();
     
    		Utilisateur user = (Utilisateur) session.getAttribute("user");
     
            buildMenuAccueil();
            buildMenuAdministration(user);
            buildMenuDeconnexion();
        }
     
        /**
         * Construis le sous-menu "Accueil"
         */
        private void buildMenuAccueil() {
        	DefaultMenuItem accueil = new DefaultMenuItem("Accueil", "ui-icon-home");
            accueil.setOutcome(IUrlLocation.URL_ACCUEIL);
            menuModel.addElement(accueil);
        }
     
        /**
             * Construis le sous-menu "Administration"
             */
    	private void buildMenuAdministration(Utilisateur user) {
    		if (user != null && user.isAdmin()) {
    			DefaultSubMenu administration = new DefaultSubMenu("Administration", "");
     
    			DefaultMenuColumn adminGestionColumn = new DefaultMenuColumn();
     
    			// Administration -> Gestion
    			DefaultSubMenu adminGestion = new DefaultSubMenu("Gestion");
     
    			// Administration -> Gestion -> Gestion des utilisateurs
    			DefaultMenuItem gestionUtilisateurs = new DefaultMenuItem("Utilisateurs");
    			gestionUtilisateurs.setOutcome(IUrlLocation.URL_GESTION_USERS);
    			gestionUtilisateurs.setUpdate(ID_UPDATE);
    			adminGestion.addElement(gestionUtilisateurs);
     
    			// Administration -> Gestion -> Gestion des employés
    			DefaultMenuItem gestionEmployes = new DefaultMenuItem("Employes");
    			gestionEmployes.setOutcome(IUrlLocation.URL_GESTION_EMPLOYES);
    			gestionEmployes.setUpdate(ID_UPDATE);
    			adminGestion.addElement(gestionEmployes);
     
    			// Administration -> Gestion -> Gestion des dossiers
    			DefaultMenuItem gestionDossiers = new DefaultMenuItem("Dossiers");
    			gestionDossiers.setOutcome(IUrlLocation.URL_GESTION_DOSSIERS);
    			gestionDossiers.setUpdate(ID_UPDATE);
    			adminGestion.addElement(gestionDossiers);
     
    			adminGestionColumn.addElement(adminGestion);
     
    			administration.addElement(adminGestionColumn);
    			menuModel.addElement(administration);
    		}
    	}
     
    	/**
             * Construis le sous-menu "Déconnexion"
             */
    	private void buildMenuDeconnexion() {
    		DefaultMenuItem deconnexion = new DefaultMenuItem("Deconnexion", "ui-icon-close");
            deconnexion.setCommand("#{menuView.logout}");
            menuModel.addElement(deconnexion);
    	}
     
        /**
         * Retourne le model du menu
         */
        public MenuModel getMenuModel() {
            return menuModel;
        }
     
    	/**
             * Méthode de déconnexion de l'utilisateur
             */
    	public void logout() {
    		FacesContext context = FacesContext.getCurrentInstance();
    		ExternalContext externalContext = context.getExternalContext();
     
    		try {
    			HttpSession session = ((HttpServletRequest) externalContext
    					.getRequest()).getSession();
    			session.invalidate();
     
    			externalContext.redirect(externalContext.getContextName() + IUrlLocation.URL_LOGOUT);
    		} catch (Exception e) {
    			context.addMessage(null, new FacesMessage(e.getMessage()));
    		}
    	}
    }
    ManagedBean de login :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
     
    @ManagedBean
    @RequestScoped
    public class ConnexionForm {
     
    	private String login;
    	private String password;
    	private boolean remembered;
    	private String originalURL;
     
    	/**
             * Default Constructor
             */
    	public ConnexionForm() {
    	}
     
    	@PostConstruct
    	public void init() {
    		ExternalContext externalContext = FacesContext.getCurrentInstance()
    				.getExternalContext();
    		originalURL = (String) externalContext.getRequestMap().get(
    				RequestDispatcher.FORWARD_REQUEST_URI);
     
    		if (originalURL == null) {
    			originalURL = externalContext.getRequestContextPath()
    					+ IUrlLocation.URL_ACCUEIL;
    		} else {
    			String originalQuery = (String) externalContext.getRequestMap()
    					.get(RequestDispatcher.FORWARD_QUERY_STRING);
     
    			if (originalQuery != null) {
    				originalURL += "?" + originalQuery;
    			}
    		}
    	}
     
     
    	public String getLogin() {
    		return login;
    	}
     
    	public void setLogin(String login) {
    		this.login = login;
    	}
     
    	public String getPassword() {
    		return password;
    	}
     
    	public void setPassword(String password) {
    		this.password = password;
    	}
     
    	public boolean isRemembered() {
    		return remembered;
    	}
     
    	public void setRemembered(boolean remembered) {
    		this.remembered = remembered;
    	}
     
    	public void authenticate() throws IOException {
    		FacesContext context = FacesContext.getCurrentInstance();
    		ExternalContext externalContext = context.getExternalContext();
     
    		try {
    			 if("nicolas".equals(login) && "bob".equals(password)){
    				 Utilisateur user = new Utilisateur();
    				 user.setLogin(login);
    				 user.setAdmin(true);
     
    				 HttpSession session = ((HttpServletRequest) externalContext.getRequest()).getSession();
    				 session.setAttribute("user", user);
     
    			     externalContext.redirect(originalURL);
    		     } else if("jean".equals(login) && "bob".equals(password)){
    				 Utilisateur user = new Utilisateur();
    				 user.setLogin(login);
    				 user.setAdmin(false);
     
    				 HttpSession session = ((HttpServletRequest) externalContext.getRequest()).getSession();
    				 session.setAttribute("user", user);
     
    			     externalContext.redirect(originalURL);
    		     }
     
    			 throw new Exception(getMessage());
    		} catch (Exception e) {
    	        context.addMessage(null, new FacesMessage(getMessage()));
    	    }
    	}
     
    	private String getMessage() {
    		return Messages.getMessage("NomUtilisateurOuMotDePasseInconnu", null)
    				.getSummary();
    	}
    }
    Le menu.xhtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version='1.0' encoding='UTF-8' ?>
    <!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:h="http://java.sun.com/jsf/html"
          xmlns:p="http://primefaces.org/ui"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets">
      <body>
      	<p:megaMenu orientation="horizontal" style="margin-top:0px;" model="#{menuView.menuModel}" />
      </body>
    </html>
    Le filtre :
    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
    public class LoginFilter implements Filter {
     
        /**
         * Checks if user is logged in. If not it redirects to the login.xhtml page.
         */
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            // Get the loginBean from session attribute
            Utilisateur loginBean = (Utilisateur) ((HttpServletRequest) request).getSession().getAttribute("user");
     
            // For the first application request there is no loginBean in the session so user needs to log in
            // For other requests loginBean is present but we need to check if user has logged in successfully
            if (loginBean == null) {
                String contextPath = ((HttpServletRequest)request).getContextPath();
                ((HttpServletResponse) response).sendRedirect(contextPath + "/connexion/login.xhtml");
            }
     
            chain.doFilter(request, response);
        }
     
        public void init(FilterConfig config) throws ServletException {
            // Nothing to do here!
        }
     
        public void destroy() {
            // Nothing to do here!
        }   
     
    }
    Qqun a-t-il une idée pour résoudre ce problème ?
    Merci d'avance pour votre précieuse aide

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il y a un moyen simple de régler ce problème, tu retires l'annotation @PostConstruct et tu fais la construction du menu dans le getter si besoin
    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
     
    @ManagedBean
    @SessionScoped
    public class MenuView
    {
        private static final String ID_UPDATE = "messages";
        private Utilisateur user = null;
        private MenuModel menuModel = null;
     
        /**
         * Retourne le model du menu
         */
        public MenuModel getMenuModel() 
        {
            FacesContext context = FacesContext.getCurrentInstance();
            ExternalContext externalContext = context.getExternalContext();
            HttpSession session = ((HttpServletRequest) externalContext.getRequest()).getSession();
     
            Utilisateur currentUser = (Utilisateur) session.getAttribute("user");
            if (menuModel != null && currentUser == user)
            {
                return menuModel;
            }
            menuModel = new DefaultMenuModel();
            buildMenuAccueil();
            buildMenuAdministration(user);
            buildMenuDeconnexion();
            user = currentUser;
        }
     
        ...
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Hello,

    Désolé pour la réponse tardive, j'étais absent ces derniers jours.
    J'ai essayé ça fonctionne très bien.

    Merci beaucoup

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

Discussions similaires

  1. Déclaration dynamique selon user connecté
    Par complicated dans le forum Forms
    Réponses: 2
    Dernier message: 24/11/2011, 17h44
  2. Réponses: 2
    Dernier message: 22/08/2008, 12h37
  3. [PHP-JS] Problème dans un menu dynamique
    Par jujutonio dans le forum Langage
    Réponses: 8
    Dernier message: 07/02/2007, 15h32
  4. Problème sur menu déroulant selon requête
    Par Lola21 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 30/06/2006, 11h05
  5. [HTML+CSS] Problème de menu "dynamique"
    Par Invité dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 06/04/2005, 12h48

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