我正在使用带有自定义身份验证提供程序的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。
谢谢。
答案 0 :(得分:1)
成功登录后,Spring Security将创建一个Authentication
对象,并将其放入HTTP会话的SecurityContext
中。只要您在服务器上有一个带有有效Authentication
对象的有效会话,Spring Security便不会再次对您的请求进行身份验证,而将使用会话中保存的Authentication
对象。
答案 1 :(得分:0)
这是Spring Security的功能,请参见SEC-53:
在SecurityContextHolder中检查经过身份验证的身份验证,然后重新使用它,请不要再次调用身份验证管理器。
如果您想重新认证,可以
在两种情况下,Spring Security都不会在会话中找到经过身份验证的用户,而是将使用新的用户名和密码进行身份验证。