Spring Security:自定义身份验证提供程序

时间:2017-08-24 06:07:25

标签: spring-mvc spring-security custom-authentication

我开发了一个带有spring mvc的应用程序,用于高用户流量。假设至少有20,000个并发用户。我已经通过两种方式实现了Spring安全自定义身份验证提供程序 第一个是:

@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {

    String username = authentication.getName();
    String password = authentication.getCredentials().toString();
    CustomUser user = _userDetailService.loadUserByUsername(username);
    if (user == null || !user.getUsername().equalsIgnoreCase(username)) {
        throw new BadCredentialsException("Username not found.");
    }
    if (!BCrypt.checkpw(password, user.getPassword())) {
        throw new BadCredentialsException("Wrong password.");
    }
    Collection < ? extends GrantedAuthority > authorities = user.getAuthorities();
    return new UsernamePasswordAuthenticationToken(user, password, authorities);
}

第二个是:

@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
  try {
    Authentication auth = super.authenticate(authentication);
    //if reach here, means login success, else an exception will be thrown
    //reset the user_attempts
    return auth;

  } catch (BadCredentialsException e) {
    //invalid login, update to user_attempts
    throw e;
  }
}

现在我的问题是实施会给我带来更快的输出吗?

1 个答案:

答案 0 :(得分:1)

正如Afridi已经指出的那样,你的第一个版本正是DaoAuthenticationProvider应该做的。我强烈反对重新实现其功能,因为您可能会引入新的安全相关错误。

如果您确实需要自定义身份验证方法,那么当然无法绕过自定义身份验证方法。为了测量此实现的一般性能或与标准实现的性能,您应该简单地定义一个测试场景(例如20000个虚拟身份验证,如同建议的homlis83)并在分析器中运行该程序。这将是您在身份验证方法中花费多少时间以及甚至哪个部分花费最多时间的方式。

我认为最流行的Java分析器是VisualVM,根据您的IDE,可能有一个插件可以进一步简化其使用。还有很多关于Java分析的教程,但这绝对是获得可靠性能数据的方法。