Как предложено Робом Уинчем в http://forum.springsource.org/showthread.php?108640-Login-attempts-Spring-security, Я просто подклассифицировал DaoAuthenticationProvider
(что также можно было бы сделать с использованием аспекта, как предлагает Ритеш), чтобы ограничить количество неудачных входов в систему, но вы также можете утверждать предварительноа также условия:
public class LimitingDaoAuthenticationProvider extends DaoAuthenticationProvider {
@Autowired
private UserService userService;
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
// Could assert pre-conditions here, e.g. rate-limiting
// and throw a custom AuthenticationException if necessary
try {
return super.authenticate(authentication);
} catch (BadCredentialsException e) {
// Will throw a custom exception if too many failed logins have occurred
userService.recordLoginFailure(authentication);
throw e;
}
}
}
В XML конфигурации Spring просто ссылайтесь на этот bean-компонент:
<beans id="authenticationProvider"
class="mypackage.LimitingDaoAuthenticationProvider"
p:userDetailsService-ref="userDetailsService"
p:passwordEncoder-ref="passwordEncoder"/>
<security:authentication-manager>
<security:authentication-provider ref="authenticationProvider"/>
</security:authentication-manager>
Обратите внимание, что я думаю, что решения, основанные на доступе к AuthenticationException
'authentication
или extraInformation
свойства (такие как реализация AuthenticationFailureHandler
), вероятно, не должны использоваться, потому что эти свойства теперь устарели (по крайней мере, в Spring Security 3.1).