Java tutorial
/** * * ESUP-Portail MONDOSSIERWEB - Copyright (c) 2016 ESUP-Portail consortium * * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package fr.univlorraine.mondossierweb.controllers; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.List; import javax.annotation.Resource; import org.aopalliance.intercept.MethodInvocation; import org.esupportail.portal.ws.client.PortalGroup; import org.esupportail.portal.ws.client.PortalUser; import org.esupportail.portal.ws.client.support.uportal.CachingUportalServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.query.Procedure; import org.springframework.ldap.core.DirContextOperations; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.access.ConfigAttribute; import org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor; import org.springframework.security.authentication.InsufficientAuthenticationException; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.ldap.search.LdapUserSearch; import org.springframework.security.util.MethodInvocationUtils; import org.springframework.security.web.authentication.switchuser.SwitchUserFilter; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import com.vaadin.navigator.View; import fr.univlorraine.mondossierweb.GenericUI; import fr.univlorraine.mondossierweb.entities.apogee.Utilisateur; import fr.univlorraine.mondossierweb.entities.mdw.Administrateurs; import fr.univlorraine.mondossierweb.entities.mdw.PreferencesUtilisateur; import fr.univlorraine.mondossierweb.entities.mdw.PreferencesUtilisateurPK; import fr.univlorraine.mondossierweb.entities.mdw.UtilisateurSwap; import fr.univlorraine.mondossierweb.repositories.mdw.AdministrateursRepository; import fr.univlorraine.mondossierweb.repositories.mdw.PreferencesUtilisateurRepository; import fr.univlorraine.mondossierweb.repositories.mdw.UtilisateurSwapRepository; import fr.univlorraine.mondossierweb.security.MdwUserDetailsService; import fr.univlorraine.mondossierweb.services.apogee.UtilisateurService; import fr.univlorraine.mondossierweb.services.apogee.UtilisateurServiceImpl; import fr.univlorraine.mondossierweb.utils.PropertyUtils; import fr.univlorraine.mondossierweb.utils.Utils; /** * Gestion de l'utilisateur */ @Component public class UserController { private Logger LOG = LoggerFactory.getLogger(UserController.class); /* Injections */ @Resource private transient ApplicationContext applicationContext; @Resource private transient Environment environment; /*@Resource private transient UserDetailsService userDetailsService;*/ @Resource private transient LdapUserSearch ldapUserSearch; @Resource private transient MethodSecurityInterceptor methodSecurityInterceptor; @Resource private transient CachingUportalServiceImpl portalService; /** {@link UtilisateurServiceImpl} */ @Resource private UtilisateurService utilisateurService; @Resource private PreferencesUtilisateurRepository preferencesUtilisateurRepository; @Resource private AdministrateursRepository administrateursRepository; @Resource private UtilisateurSwapRepository utilisateurSwapRepository; @Resource private transient ConfigController configController; /** * type utilisateur tudiant. */ public static final String STUDENT_USER = "student"; /** * type correspondant un utilisateur dont le login doit tre exclu de l'application. */ public static final String LOGIN_EXCLU = "exclu"; /** * type utilisateur enseignant. */ public static final String TEACHER_USER = "teacher"; /** * type utilisateur non-autoris. */ public static final String UNAUTHORIZED_USER = "unauthorized"; /** * @return l'authentification courante */ public Authentication getCurrentAuthentication() { return SecurityContextHolder.getContext().getAuthentication(); } /** * @param viewClass * @return true si l'utilisateur peut accder la vue */ public boolean canCurrentUserAccessView(Class<? extends View> viewClass) { MethodInvocation methodInvocation = MethodInvocationUtils.createFromClass(viewClass, "enter"); Collection<ConfigAttribute> configAttributes = methodSecurityInterceptor.obtainSecurityMetadataSource() .getAttributes(methodInvocation); // Renvoie true si la vue n'est pas scurise if (configAttributes == null || configAttributes.isEmpty()) { return true; } // Vrifie que l'utilisateur a les droits requis try { methodSecurityInterceptor.getAccessDecisionManager().decide(getCurrentAuthentication(), methodInvocation, configAttributes); } catch (InsufficientAuthenticationException | AccessDeniedException e) { return false; } return true; } /** * @return user utilisateur courant */ public UserDetails getCurrentUser() { return (UserDetails) getCurrentAuthentication().getPrincipal(); } /** * @return username de l'utilisateur courant */ public String getCurrentUserName(String username) { //return "toto54"; UtilisateurSwap us = utilisateurSwapRepository.findOne(username); if (us != null && us.getLoginCible() != null) { //test si la date de cration du swap utilisateur n'est pas plus vieille que 1 heure Calendar dateButoire = Calendar.getInstance(); dateButoire.setTime(us.getDatCre()); dateButoire.add(Calendar.HOUR_OF_DAY, Utils.NB_HEURE_DUREE_SWAP_USER); Date d = new Date(); if (d.compareTo(dateButoire.getTime()) < 0) { //swap autorise return us.getLoginCible(); } } return username; } /** * @return username de l'utilisateur courant */ public String getCurrentUserName() { //return "toto54"; if (GenericUI.getCurrent() != null) { //Si on n'a pas dj rcupr le login if (!StringUtils.hasText(GenericUI.getCurrent().getUsername())) { //On le rcupre GenericUI.getCurrent().setUsername(getCurrentAuthentication().getName()); } return GenericUI.getCurrent().getUsername(); } return getCurrentAuthentication().getName(); } /** * @return true si l'utilisateur a pris le rle d'un autre utilisateur */ /*public boolean isUserSwitched() { for (GrantedAuthority ga : SecurityContextHolder.getContext().getAuthentication().getAuthorities()) { if (SwitchUserFilter.ROLE_PREVIOUS_ADMINISTRATOR.equals(ga.getAuthority())) { return true; } } return false; }*/ /** * Change le rle de l'utilisateur courant * @param username */ /*public void switchToUser(String username) { if (!StringUtils.hasText(username)) { throw new IllegalArgumentException("username ne peut tre vide."); } // Vrifie que l'utilisateur existe try { userDetailsService.loadUserByUsername(username); } catch (UsernameNotFoundException unfe) { Notification.show(applicationContext.getMessage("admin.switchUser.usernameNotFound", new Object[] {username}, UI.getCurrent().getLocale()), Notification.Type.WARNING_MESSAGE); return; } String switchToUserUrl = environment.getRequiredProperty("switchUser.switchUrl") + "?" + SwitchUserFilter.SPRING_SECURITY_SWITCH_USERNAME_KEY + "=" + username; Page.getCurrent().open(switchToUserUrl, null); }*/ public boolean isEnseignant() { //On teste si la gnricUI est dj initialise if (GenericUI.getCurrent() != null) { //Si on connait dj le statut de l'utilisateur if (GenericUI.getCurrent() != null && StringUtils.hasText(GenericUI.getCurrent().getUserIsEnseignant())) { //On retourne l'tat return Utils.getBooleanFromString(GenericUI.getCurrent().getUserIsEnseignant()); } //Un admin a les droits d'un enseignant if (isAdmin()) { //On enregistre l'tat if (GenericUI.getCurrent() != null) { GenericUI.getCurrent().setUserIsEnseignant("O"); GenericUI.getCurrent().setUserIsEtudiant("N"); } return true; } //On dtermine le type de l'utilisateur if (GenericUI.getCurrent().getTypeUser() == null) { determineTypeUser(); } //Si c'est un enseignant if (GenericUI.getCurrent().getTypeUser() != null && GenericUI.getCurrent().getTypeUser().equals(TEACHER_USER)) { //On enregistre l'tat if (GenericUI.getCurrent() != null) { GenericUI.getCurrent().setUserIsEnseignant("O"); GenericUI.getCurrent().setUserIsEtudiant("N"); } return true; } //On enregistre l'tat GenericUI.getCurrent().setUserIsEnseignant("N"); return false; } else { //La GenericUI n'est pas encore initialise //Si c'est un admin if (isAdmin()) { //Alors il a les droits enseignants return true; } //On va dterminer le type de l'utilisateur String type = determineTypeUser(getCurrentUserName()); //Si c'est un enseignant if (type != null && type.equals(TEACHER_USER)) { return true; } return false; } } public boolean isEtudiant() { //On teste si la gnricUI est dj initialise if (GenericUI.getCurrent() != null) { //Si on connait dj le statut de l'utilisateur if (StringUtils.hasText(GenericUI.getCurrent().getUserIsEtudiant())) { //On retourne l'tat return Utils.getBooleanFromString(GenericUI.getCurrent().getUserIsEtudiant()); } if (GenericUI.getCurrent().getTypeUser() == null) { determineTypeUser(); } if (GenericUI.getCurrent().getTypeUser() != null && GenericUI.getCurrent().getTypeUser().equals(STUDENT_USER)) { //On enregistre l'tat if (GenericUI.getCurrent() != null) { GenericUI.getCurrent().setUserIsEtudiant("O"); GenericUI.getCurrent().setUserIsEnseignant("N"); } return true; } //On enregistre l'tat GenericUI.getCurrent().setUserIsEtudiant("N"); return false; } else { //La GenericUI n'est pas encore initialise //On va dterminer le type de l'utilisateur String type = determineTypeUser(getCurrentUserName()); //Si c'est un enseignant if (type != null && type.equals(STUDENT_USER)) { return true; } return false; } } public String determineTypeUser(String username) { List<String> type = typeLdap(username); if (StringUtils.hasText(PropertyUtils.getTypeEtudiantLdap()) && type != null && type.contains(PropertyUtils.getTypeEtudiantLdap())) { return STUDENT_USER; } else { //on cherche a savoir si l'employ a acces (ex: c'est un enseignant) //si il est autoris type=enseignant, sinon type=non-autorise boolean useruportal = false; try { //on reucupre la liste de groupes mis dans le bean security List<String> listegroupes = PropertyUtils.getListeGroupesUportalAutorises(); //on test si on est en portlet if (listegroupes != null && listegroupes.size() > 0) { //recupre l'utilisateur uportal PortalUser portaluser = portalService.getUser(username); //on cherche si il appartient a un groupe useruportal = false; //on regarde si il appartient a un des groupes for (String nomgroupe : listegroupes) { //si on est pas dj sur qu'il appartient a un groupe: if (!useruportal) { //on cherche le groupe PortalGroup pgroup = portalService.getGroupByName(nomgroupe); if (pgroup != null) { //on regarde si l'utilisateur appartient a ce groupe if (portalService.isUserMemberOfGroup(portaluser, pgroup)) { //c'est un utilisateur uportal useruportal = true; } } } } } } catch (Exception e) { //Test prsence dans la table utilisateur de Apogee LOG.info("PROBLEME DE CONNEXION AUX GROUPES UPORTAL"); } boolean userldap = false; //Si pas user uportal on va chercher dans le ldap si mdw est configur pour cela if (!useruportal) { //on recupre la liste de groupes ldap mis dans le bean security List<String> listegroupes = PropertyUtils.getListeGroupesLdapAutorises(); //test si on a des groupes renseignes if (StringUtils.hasText(PropertyUtils.getAttributGroupeLdap()) && listegroupes != null && listegroupes.size() > 0) { //on recupre l'utilisateur ldap DirContextOperations dco = ldapUserSearch.searchForUser(username); if (dco != null) { String[] vals = dco.getStringAttributes(PropertyUtils.getAttributGroupeLdap()); if (vals != null) { List<String> lmemberof = Arrays.asList(vals); //Si le compte LDAP possede des groupes if (lmemberof != null && lmemberof.size() > 0) { //on regarde si il appartient a un des groupes for (String groupe : listegroupes) { // on cherche le groupe si il n'est pas dj trouv if (!userldap) { //on cherche le groupe if (lmemberof.contains(groupe)) { userldap = true; } } } } } } if (!userldap) { LOG.debug("utilisateur " + username + " n'appartient aucun groupe ldap autorises"); } } } if (useruportal || userldap) { //c'est un utilisateur uportal il est donc autoris en tant qu'enseignant LOG.debug("USER " + username + " ENSEIGNANT VIA UPORTAL"); return TEACHER_USER; } else { //va voir dans apoge LOG.debug("USER " + username + " NON ENSEIGNANT VIA UPORTAL OU GROUPES LDAP -> Recherche Apoge"); //On test si on doit chercher l'utilisateur dans Apogee if (PropertyUtils.isLoginApogee()) { //Test de la prsence dans la table utilisateur d'Apogee //on regarde si il est dans la table utilisateur try { Utilisateur uti = utilisateurService.findUtilisateur(username.toUpperCase()); if (uti != null) { LOG.debug("USER " + username + " ENSEIGNANT VIA APOGEE.UTILISATEUR"); return TEACHER_USER; } else { LOG.debug("utilisateur " + username + " n' est pas dans le LDAP en tant qu' etudiant, n'appartient aucun groupe uportal, et n'est pas dans la table utilisateur d'APOGEE -> UTILISATEUR NON AUTORISE !"); return UNAUTHORIZED_USER; } } catch (Exception ex) { LOG.error( "Probleme lors de la vrification de l'existence de l'utilisateur dans la table Utilisateur de Apogee", ex); } } else { LOG.info("Utilisateur " + username + " n' est pas dans le LDAP en tant qu' etudiant, n'appartient aucun groupe uportal -> UTILISATEUR NON AUTORISE !"); return UNAUTHORIZED_USER; } } } return UNAUTHORIZED_USER; } public void determineTypeUser() { GenericUI.getCurrent().setTypeUser(null); List<String> llogins = configController.getListeLoginsBloques(); if (llogins != null && llogins.contains(getCurrentUserName())) { GenericUI.getCurrent().setTypeUser(UNAUTHORIZED_USER); LOG.debug("utilisateur " + getCurrentUserName() + " bloqu car il a t exclu de l'application"); } else { String type = determineTypeUser(getCurrentUserName()); if (type != null && type.equals(STUDENT_USER)) { GenericUI.getCurrent().setTypeUser(STUDENT_USER); GenericUI.getCurrent().getAnalyticsTracker().trackEvent(getClass().getSimpleName(), "Identification_etudiant"); } if (type != null && type.equals(TEACHER_USER)) { GenericUI.getCurrent().setTypeUser(TEACHER_USER); GenericUI.getCurrent().getAnalyticsTracker().trackEvent(getClass().getSimpleName(), "Identification_enseignant"); } if (type != null && type.equals(UNAUTHORIZED_USER)) { GenericUI.getCurrent().setTypeUser(UNAUTHORIZED_USER); LOG.debug("utilisateur " + getCurrentUserName() + " n' est pas dans le LDAP en tant qu' etudiant, n'appartient aucun groupe uportal, et n'est pas dans la table utilisateur d'APOGEE -> UTILISATEUR NON AUTORISE !"); } } } /** * * @param login de l'utilisateur * @return le type retourn par ldap. */ public List<String> typeLdap(final String login) { try { if (ldapUserSearch.searchForUser(login) != null) { DirContextOperations dco = ldapUserSearch.searchForUser(login); if (dco != null) { String[] vals = dco.getStringAttributes(PropertyUtils.getAttributLdapEtudiant()); if (vals != null) { List<String> listeValeurs = Arrays.asList(vals); return listeValeurs; } } } return null; } catch (Exception e) { LOG.error("Probleme la recuperation de l'utilisateur : " + login + " dans le LDAP", e); return null; } } /** * * @param login de l'utilisateur * @return vrai si le compte est dans le ldap le type retourn par ldap. */ public boolean estDansLeLdap(final String login) { try { if (ldapUserSearch.searchForUser(login) != null) { return true; } return false; } catch (Exception e) { LOG.error("Probleme la recuperation de l'utilisateur : " + login + " dans le LDAP", e); return false; } } /** * @param preference * @return la valeur pour l'utilisateur de la prfrence en parametre */ public String getPreference(String preference) { PreferencesUtilisateur pu = preferencesUtilisateurRepository .findOnePrefFromLoginAndPrefid(getCurrentUserName(), preference); if (pu != null && pu.getId() != null && pu.getValeur() != null) { return pu.getValeur(); } return null; } /** * Met jour la valeur pour l'utilisateur de la prfrence en parametre avec la valeur en parametre * @param showMessageNotesPreference * @param valeur */ @Procedure public void updatePreference(String showMessageNotesPreference, String valeur) { PreferencesUtilisateur pu = new PreferencesUtilisateur(); PreferencesUtilisateurPK pupk = new PreferencesUtilisateurPK(); pupk.setLogin(getCurrentUserName()); pupk.setPrefid(showMessageNotesPreference); pu.setId(pupk); pu.setValeur(valeur); preferencesUtilisateurRepository.save(pu); } public boolean isAdmin(String login) { Administrateurs adm = administrateursRepository.findOne(login); //Si le login est dans la table admin if (adm != null && adm.getLogin() != null && adm.getLogin().equals(login)) { //On vrifie quand mme que l'utilisateur est prsent dans le ldap if (estDansLeLdap(login)) { return true; } } return false; } public boolean isAdmin() { return isAdmin(getCurrentUserName()); } public boolean userCanAccessAdminView() { //On parcourt les droits for (GrantedAuthority ga : SecurityContextHolder.getContext().getAuthentication().getAuthorities()) { //Si a l'autorisation de consulter la vue adminView if (MdwUserDetailsService.CONSULT_ADMINVIEW_AUTORISE.equals(ga.getAuthority())) { return true; } } return false; } }