我有一个春季启动项目。使用不正确的用户凭据发出请求时:
catch (RuntimeException ex) {
log.error("Error occurred while fetching user {}: {}", securityPrincipal, ex);
throw new UsernameNotFoundException("Could not find user: " + securityPrincipal);
}
但最终抛出的异常是500。
经过多次链接后,我发现:
protected AbstractPreAuthenticatedProcessingFilter multiPreAuthenticatedProcessingFilter() throws Exception {
MultiPreAuthenticatedProcessingFilter filter = new MultiPreAuthenticatedProcessingFilter();
filter.setAuthenticationManager(authenticationManager());
filter.setPreAuthenticatedPrincipalProviders(preAuthenticatedPrincipalProviders);
filter.setCheckForPrincipalChanges(true);
filter.setInvalidateSessionOnPrincipalChange(true);
filter.setContinueFilterChainOnUnsuccessfulAuthentication(**true**);
return filter;
}
将continueFilterChainOnUnsuccesfulAuthentication更改为true将有助于按原样抛出Authentication异常。但是在更改为true之后,UsernameNotFoundException将被抛出为403而不是401.
是否缺少一些基本的安全配置?
答案 0 :(得分:3)
根据HTTP规范,提供403而不是401是绝对正确的。因为提供了凭据并且不正确。返回401表示用户应指定访问凭证。
见:
<强>更新强>
实际上,这并非100%明确原因RFC 7235如果提供的凭据不正确,则表示会返回401 。