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:
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
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; } }
Auriez-vous une idée de ce qu'il manque ou de ce que je fais de travers?
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>
Merci d'avance!
Partager