2017-05-20 19 views
-1

我有下面的类来验证用户身份在REST服务捕捉验证失败

@Service 
public class AuthenticationService { 

    private static final Logger log = LoggerFactory.getLogger(AuthenticationService.class); 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    public void getAuthentication(AccountCredentials credentials) { 

     log.info("Authentication requested for user: " + credentials.getEmail()); 

     final Authentication authentication = authenticationManager.authenticate(
       new UsernamePasswordAuthenticationToken(
         credentials.getEmail(), 
         credentials.getPassword() 
       ) 
     ); 

     SecurityContextHolder.getContext().setAuthentication(authentication); 
    } 
} 

身份验证工作正常,但我想记录每一个有一个验证失败的时间。现在它的工作方式是Spring Security默认返回403状态。如何在日志中捕获身份验证失败?我尝试过不同的方法,但代码从未达到,因为在返回403之后没有执行其他代码。我也尝试过使用try catch块,但是这会扰乱流程,我将不得不编码403响应。我喜欢保留403状态消息,并且除了在日志中捕获代码之外,不会运行其他代码。

+1

你正在为Spring Security工作,而我建议与它整合,这样你也可以听从Spring Security发出的事件之一[failure events](http://docs.spring.io/spring-security /site/docs/current/apidocs/org/springframework/security/authentication/event/AbstractAuthenticationFailureEvent.html)。 –

回答

0

我实现它像这样的答复后,从M. Deinum

@Component 
public class AuthenticationFailureListener 
     implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> { 

    private static final Logger log = LoggerFactory.getLogger(AuthenticationFailureListener.class); 

    public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) { 

     log.info("Authentication failed for user: " + event.getAuthentication().getPrincipal()); 

    } 
} 

的伟大工程。正在寻找什么。