在spring boot

时间:2016-03-22 16:10:33

标签: java spring spring-security spring-boot

我有一个春季启动项目。使用不正确的用户凭据发出请求时:

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.

是否缺少一些基本的安全配置?

1 个答案:

答案 0 :(得分:3)

根据HTTP规范,提供403而不是401是绝对正确的。因为提供了凭据并且不正确。返回401表示用户应指定访问凭证。

见:

<强>更新

实际上,这并非100%明确原因RFC 7235如果提供的凭据不正确,则表示会返回401