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 :

customAuthenticationProvider: comment faire? [Security]


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 customAuthenticationProvider: comment faire?
    Bonjour à tous,

    Je voudrais personnaliser le système d'authentification de Spring security pour enregistrer la dernière date de connexion de l'utilisateur et ajouter une protection contre les attaques brute force.

    Pour se faire, j'ai créé mon propre AuthenticationProvider, mais il ne semble pas appelé au moment du login. N'étant pas expert en Spring Security, je suppose que je l'ai mal configuré?

    Voici le code de mon AuthenticationProvider:
    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
    package mypackage.security;
     
    import java.util.Calendar;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.Hashtable;
    import java.util.Map;
     
    import org.springframework.security.AuthenticationException;
    import org.springframework.security.InsufficientAuthenticationException;
    import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
    import org.springframework.security.providers.dao.DaoAuthenticationProvider;
    import org.springframework.security.userdetails.UserDetails;
     
    import mypackage.model.User;
    import mypackage.service.UserManager;
     
    public class AuthenticationProvider extends DaoAuthenticationProvider{
     
        private UserManager userManager;
     
        private Map<String,Date> failures = new Hashtable<String,Date>();
     
        /**
         * We set last login date after the additional authentication checks.
         */
        @Override
        protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException{
            Date now = new Date();
            Date previousFailure = failures.get(userDetails.getUsername()); 
            if (previousFailure != null){
                Calendar calendar = new GregorianCalendar();
                calendar.setTimeInMillis(previousFailure.getTime());
                calendar.add(Calendar.SECOND, 200);
                if (now.before(calendar.getTime())) throw new InsufficientAuthenticationException("User must wait 2 seconds after authentication failure");
            }
            try{
                super.additionalAuthenticationChecks(userDetails, authentication);
            } catch (AuthenticationException e){
                failures.put(userDetails.getUsername(), now);
                throw e;
            }
            failures.remove(userDetails.getUsername());
            if (!(userDetails instanceof SpringSecurityUser)) return;
            User user = ((SpringSecurityUser)userDetails).getUser();
     
            user.setLastLoginOn(now);
            userManager.addToLoggedUsers(user);
            userManager.save(user);
        }
     
        /**
         * Sets the user manager.
         * This method is mainly used by Spring injection.
         * 
         * @param userManager the manager to set.
         */
        public void setUserManager(UserManager userManager) {
            this.userManager = userManager;
        }
    }
    Voici également le code de mon applicationContext-Security.xml :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/security" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:beans="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/security
            http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">
     
        <http access-denied-page="/accessDenied.html" >
            <intercept-url pattern="/css/**" filters="none" />
            <intercept-url pattern="/js/**" filters="none" />
            <intercept-url pattern="/a4j/**" filters="none" />
            <intercept-url pattern="/log*" filters="none" /> <!-- Login / logout -->
            <intercept-url pattern="/j_spring*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
            <intercept-url pattern="/pages/admin/**" access="ROLE_ADMIN" />
            <intercept-url pattern="/pages/**" access="ROLE_USER,ROLE_ADMIN" />
            <intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" />
            <form-login login-page="/login.html" default-target-url="/pages/userlist.html"/>
            <anonymous />
            <http-basic />
            <logout logout-success-url="/login.html"/>
            <remember-me />
        </http>
     
        <beans:bean id="customAuthenticationProvider" class="mypackage.security.AuthenticationProvider" autowire="byName">
            <custom-authentication-provider/>
        </beans:bean>
     
        <authentication-provider user-service-ref="userDetailsService">
            <password-encoder hash="sha">
                <salt-source user-property="salt"/>
            </password-encoder>
        </authentication-provider>
     
        <beans:bean id="userDetailsService" class="mypackage.security.UserDetailsServiceImpl" autowire="byName"/>
        <beans:bean id="passwordEncoder" class="org.springframework.security.providers.encoding.ShaPasswordEncoder"/>
     
     
    </beans:beans>
    Auriez-vous une idée de ce qu'il manque ou de ce que je fais de travers?

    Merci d'avance!

  2. #2
    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 [Résolu]
    Je ne sais pas exactement ce qui clochait, mais j'ai trouvé du code qui fait exactement ce que je souhaite faire ici, pour ceux que ça intéresserait :

    http://blog.richardadamdean.com/?p=213

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

Discussions similaires

  1. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  2. comment faire evoluer ma base vers interbase6
    Par toure32 dans le forum InterBase
    Réponses: 5
    Dernier message: 23/10/2002, 10h59
  3. Réponses: 8
    Dernier message: 18/09/2002, 03h20
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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