Spring Security Baisc身份验证仅验证第一个请求

时间:2018-07-18 11:35:50

标签: java spring spring-security

我正在使用带有自定义身份验证提供程序的spring基本身份验证:

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private CustomAuthenticationProvider authProvider;

@Override
protected void configure(
        AuthenticationManagerBuilder auth) throws Exception {

    auth.authenticationProvider(authProvider);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().anyRequest().authenticated()
            .and()
            .httpBasic();
}

    @Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

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

    String name = authentication.getName();
    String password = authentication.getCredentials().toString();

    if (customauth()) { // use the credentials
        // and authenticate against the third-party system
        {
            return new UsernamePasswordAuthenticationToken(
                    name, password, new ArrayList<>());
        }
    } else {
        return null;
    }

}

@Override
public boolean supports(Class<?> authentication) {
    return authentication.equals(
            UsernamePasswordAuthenticationToken.class
    );
}

要对此进行测试,我使用邮递员进行以下测试:

无效的凭据-> 401未经授权

正确的凭据-> 200 OK

无效的凭据-> 200 OK

我的问题是,即使有错误的令牌且没有令牌,上次请求也应返回401未经授权,并且成功登录后的每个后续请求都是200 OK。

谢谢。

2 个答案:

答案 0 :(得分:1)

成功登录后,Spring Security将创建一个Authentication对象,并将其放入HTTP会话的SecurityContext中。只要您在服务器上有一个带有有效Authentication对象的有效会话,Spring Security便不会再次对您的请求进行身份验证,而将使用会话中保存的Authentication对象。

答案 1 :(得分:0)

这是Spring Security的功能,请参见SEC-53

  

在SecurityContextHolder中检查经过身份验证的身份验证,然后重新使用它,请不要再次调用身份验证管理器。

如果您想重新认证,可以

  • 完全不使用会话
  • 在重新认证之前注销

在两种情况下,Spring Security都不会在会话中找到经过身份验证的用户,而是将使用新的用户名和密码进行身份验证。