我需要在Spring Security中实现自定义身份验证:对于每个REST请求,我需要检查用户名和密码,这些请求位于每个请求的特定标头中(“用户名”和“密码”)。
所以我实现了自定义AuthEntryPoint:
@Service
public class CustomAuthEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
String username = httpServletRequest.getHeader("username");
String password = httpServletRequest.getHeader("password");
if (!username.equals("admin") || !password.equals("admin")) {
throw new RuntimeException("", new BadCredentialsException("Wrong password"));
}
}
}
因此,我意识到,RequestCacheAwareFilter正在缓存第一个请求,并且标头也存储在缓存中。因此,如果我使用错误的传递请求,然后使用正确的传递,我仍然会得到例外。
那么,我怎么能覆盖CacheAwareFilter或禁用它?或者我做错了什么?
答案 0 :(得分:3)
使用自定义WebSecurityConfigurerAdapter将请求缓存设置为NullRequestCache:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestCache()
.requestCache(new NullRequestCache());
}
}
答案 1 :(得分:0)
我刚刚让app变为无状态:How can I use Spring Security without sessions?
现在一切都还好。