小编can*_*bey的帖子

Spring Security AuthenticationFailureHandler与AuthenticationFailureEvent

我正在使用spring-security 3.1.4,我有一些要求:

  • 监视身份验证是成功还是失败
    • 如果成功,则将用户常规信息放入会话属性中
    • 如果结果是失败,那么;
      • 确定失败原因(帐户已锁定,帐户已过期,凭据已过期,用户已禁用,登录失败尝试超过等)
      • 为咆哮组件生成登录失败消息驻留在login.xhtml中
      • 采取针对失败事件的操作,例如,对于错误的凭据,在db中增加登录失败尝试和/或重定向到页面,例如重新定义凭据

我已经研究并找到了三种解决方案:

  • 实现PhaseListener哪个草率的原因会在
    所有阶段事件中调用它:

public class LoginErrorPhaseListener implements PhaseListener {
  private static final long   serialVersionUID              = -404551400448242299L;

  private static final String MESSAGES_RESOURCE_BUNDLE_NAME = "msgs";
  private static final String ACCESS_DENIED_MESSAGE_KEY     = "accessDeniedMessage";
  private static final String BAD_CREDENTIALS_MESSAGE_KEY   = "badCredentialsMessage";

  @Override
  public void beforePhase(final PhaseEvent arg0) {
    Exception e = (Exception) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(WebAttributes.AUTHENTICATION_EXCEPTION);
      if (e instanceof BadCredentialsException) {
         FacesContext fc = FacesContext.getCurrentInstance();
         ResourceBundle messages = fc.getApplication().getResourceBundle(fc, MESSAGES_RESOURCE_BUNDLE_NAME);
         fc.getExternalContext().getSessionMap().put(WebAttributes.AUTHENTICATION_EXCEPTION, null);
         fc.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, messages.getString(ACCESS_DENIED_MESSAGE_KEY), messages.getString(BAD_CREDENTIALS_MESSAGE_KEY))); …
Run Code Online (Sandbox Code Playgroud)

jsf spring spring-security

5
推荐指数
1
解决办法
1952
查看次数

标签 统计

jsf ×1

spring ×1

spring-security ×1