我正在将应用程序从Spring Security 3迁移到4.应用程序使用基于表单的用户名/密码和智能卡身份验证。它还具有自定义 AuthenticationFailureHandler ,可根据发生的错误类型和与用户关联的角色将用户重定向到特定页面。例如,对于内部和外部用户,应该以不同方式处理锁定的异常。
在Spring Security 3中, org.springframework.security.authentication.AccountStatusUserDetailsChecker 用于将UserDetails对象放入 AuthenticationException的 extraInformation 属性它扔了。我们使用自定义 AuthenticationFailureHandler 从身份验证失败的用户中提取角色,以便它可以适当地处理不同的用户类型:
@Override
public void onAuthenticationFailure(HttpServletRequest request,
HttpServletResponse response, AuthenticationException exception)
throws IOException, ServletException {
User user = (User)exception.getExtraInformation();
if(exception instanceof LockedException){
if(user.hasAnyRole(Role.INTERNAL)){
//Send to internal user page
}else{
//Send to external user page
}
}
}
但是现在使用Spring Security 4,我不确定将有关用户的信息放入故障处理程序的最佳方法,以便我可以正确地路由请求。什么被认为是“最佳实践”方法呢?
一种方法是从请求中提取相关信息(基于表单的用户名或X509证书),然后使用数据库查询查找角色,但由于早先已在Spring Security链中处理过,因此看起来像在故障处理程序中复制这些工作并不是最好的方法。
由于