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:
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:
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:
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:
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