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

Spring Java Discussion :

Login en java


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut Login en java
    Bonjour,

    J'ai une question au sujet du login Acegi. Pour diverses raisons, j'ai besoin de faire mon login en Java. Mais je n'ai pas envie de réécrire toutes les classes que fournit Acegi. J'utilise actuellement le bout de code suivant

    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
        public String loginAction(){
            UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(login, password);
            try{
                Authentication authe = daoAuthenticationProvider.authenticate(auth);
                SecurityContextImpl secureContext = new SecurityContextImpl();
                secureContext.setAuthentication(authe);            
                SecurityContextHolder.setContext(secureContext);
            } catch(AuthenticationServiceException e){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ce compte n'existe pas", e.getMessage()));
                return null;
            } catch(BadCredentialsException e){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Mot de passe incorrect", e.getMessage()));
                return null;
            } catch(LockedException e){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Votre compte a été bloqué. Contactez l'administrateur.", e.getMessage()));
                return null;
            } catch(DisabledException e){
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Votre compte n'a pas encore été activé", e.getMessage()));
                return null;
            }
            return "loginAuthorized";
        }
    Ce système fonctionne à merveille, à un bémol près : ce code ne génère pas le cookie utilisé par le service RememberMe d'Acegi.

    Auriez-vous une idée de comment je pourrais l'inclure dans ce code?

    Merci d'avance!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Par défaut
    Normalement tu dois avoir un fichier de configuration pour Acegi sous la forme d'un fichier xml me trompe-je?

    JE n'ai pas eu besoin de mon côté d'implémenter du code qui créait le cookie ... tout est fait automatiquement.

    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
    (...)
    <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
            <constructor-arg value="/login.html"/>
            <constructor-arg>
                <list>
                    <ref bean="rememberMeServices"/>
                    <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
                </list>
            </constructor-arg>
        </bean>
    (...)
        <!-- Charger de se rappeler d'un utilisateur -->
        <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
            <property name="userDetailsService" ref="userManager"/>
            <property name="key" value="cequetuveux"/>
        </bean>
        
        <bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
            <property name="authenticationManager" ref="authenticationManager"/>
            <property name="rememberMeServices" ref="rememberMeServices"/>
        </bean>
        
        <bean id="rememberMeAuthenticationProvider"  class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
            <property name="key" value="cequetuveux"/>
        </bean>
        
        <!-- Charger des providers liés à l'identification -->
        <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
            <property name="providers">
                <list>
                    <ref local="daoAuthenticationProvider" />
                    <ref local="anonymousAuthenticationProvider" />
                    <ref local="rememberMeAuthenticationProvider" />
                </list>
            </property>
        </bean>
        
        <!-- Charger de recueillir les informations d'un utilisateur et de gérer son identification  -->
        <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
            <property name="authenticationManager" ref="authenticationManager" />
            <property name="filterProcessesUrl" value="/j_security_check" />
            <property name="defaultTargetUrl" value="/user/accueil.html" />
            <property name="authenticationFailureUrl" value="/login.html?login_refused=true" />
            <property name="rememberMeServices" ref="rememberMeServices"/>
        </bean>
    (...)
    <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
            <property name="filterInvocationDefinitionSource">
                <value>
                    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                    PATTERN_TYPE_APACHE_ANT
                    /**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,rememberMeProcessingFilter,securityContextHolderAwareRequestFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
                </value>
            </property>
        </bean>
    Il ne me restais plus qu'à inclure dans ma page jsp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="_acegi_security_remember_me"/>Retenir<br/>
    Et d'inclure également dans ma classe UserManagerImpl:
    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
     
     
    (...)
     
    public class UserManagerImpl implements UserManager, UserDetailsService {
     
    (...)
     
        /* **************************************/
        /* Implémentation de UserDetailsService */
        /****************************************/
        /**
         * <p>
         * Cette méthode est chargée de récupérer les données d'un utilisateur dans
         * le cadre de la gestion de sécurité organisée par le framework Acegi
         * security.
         * </p>
         * <p>
         * Cette méthode récupère les données d'un utilisateur à partir de son login
         * et les procure au
         * <a href="http://www.acegisecurity.org/acegi-security/apidocs/org/acegisecurity/providers/dao/DaoAuthenticationProvider.html">DaoAuthenticationProvider</a>
         * définit.
         * </p>
         *
         * @param   login                       le login de l'utilisateur.
         * @return                              les détails de l'utilisateur
         *                                      recherché.
         * @throws  UsernameNotFoundException   si l'utilisateur n'est pas trouvé ou
         *                                      s'il n'a pas de rôle associé.
         * @throws  DataAccessException         si l'utilisateur ne peut être trouvé
         *                                      pour une raison technique.
         * @see     <a href="http://www.acegisecurity.org/acegi-security/apidocs/org/acegisecurity/userdetails/UserDetails.html">UserDetails</a>
         * @see     <a href="http://www.acegisecurity.org/acegi-security/apidocs/org/acegisecurity/userdetails/UserDetailsService.html#loadUserByUsername(java.lang.String)">loadUserByUserName(java.lang.String)</a>
         * @see     <a href="http://www.acegisecurity.org/acegi-security/apidocs/org/acegisecurity/userdetails/UsernameNotFoundException.html">UsernameNotFoundException</a>
         */
        public UserDetails loadUserByUsername(String login) throws UsernameNotFoundException, DataAccessException {
            // on récupère l'utilisateur dans la base de données
            User user = getUser(login.trim());
     
            // on récupère le rôle associé à cet utilisateur
            Role role = roleManager.getRole(user);
            if (role == null) {
                // s'il n'y pas de rôle associé on lance l'exception pour respecter
                // la spécification de la méthode décrite dans l'interface
                // UserDetailsService
                throw new UsernameNotFoundException("Pas de rôle pour : " + user);
            }
            // on construit le tableau des autorisations
            GrantedAuthority[] arrayAuths = new GrantedAuthority[1];
            arrayAuths[0] = new GrantedAuthorityImpl(role.getRole());
            // on construit l'objet résultat de type UserDetails
            UserDetails acegiUser = new org.acegisecurity.userdetails.User(user.getLogin(), user.getPassword(), true, true, true, true, arrayAuths);
     
            return acegiUser;
        }
     
    (...)
     
        /**
         * <p>
         * Retourne un utilisateur correspondant à <code>login</code>.
         * </p>
         *
         * @param   login                       le login de l'utilisateur recherché.
         * @return                              l'utilisateur recherché, null sinon.
         * @throws  UsernameNotFoundException   si l'utilisateur n'est pas trouvé.
         * @see     mova.logging.domain.User
         * @see     <a href="http://www.acegisecurity.org/acegi-security/apidocs/org/acegisecurity/userdetails/UsernameNotFoundException.html">UsernameNotFoundException</a>
         */
        public User getUser(String login) {
            User user = userDao.getUserByLogin(login);
     
            if (user == null) {
                throw new UsernameNotFoundException(login + " inconnu");
            }
     
            return user;
        }
     
    (...)
     
    }
    Voilà Acegi s'occupe du reste a vrai dire.... Je n'ai vraiment pas eu besoin de m'occuper du cookie. En espérant avoir aidé.

    Mohicane

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut
    Oui, tout fonctionne automatiquement, mais parce que tu ne fais pas l'authentification toi même en java, mais que tu utilises l'action action="j_acegi_security_check" dans ton élément form.

    Ainsi, avec ta config (j'ai plus ou moins la même), c'est Acegi qui se charge de mettre le cookie à ta place.

    Mais dans mon cas, je dois faire mon login en Java, je ne peux pas passer directement par Acegi. C'est pourquoi je cherche le bout de code Java qui pourra compléter le mien et se charger de faire appel au service rememberMe...

Discussions similaires

  1. Code Login Java
    Par Benefactor dans le forum Général Java
    Réponses: 4
    Dernier message: 26/07/2012, 15h40
  2. Login en java
    Par seb111983 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 23/06/2011, 22h44
  3. code en java login
    Par groupe dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 19/03/2008, 09h18
  4. Java et simple BDD pour vérifier login & passwd
    Par Invité dans le forum JDBC
    Réponses: 23
    Dernier message: 24/01/2007, 23h24

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