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 :
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
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())); } } }
Le menu.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
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 filtre :
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>
Qqun a-t-il une idée pour résoudre ce problème ?
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! } }
Merci d'avance pour votre précieuse aide
Partager