ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-在春季启动时将UsernameNotFoundException抛出为403

2019-11-18 23:20:20  阅读:209  来源: 互联网

标签:spring-boot spring-security spring java


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

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.

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

解决方法:

根据HTTP规范,服务403而不是401是绝对正确的,因为已经提供了凭据并且不正确.返回401将指示用户应指定访问凭据.

看到:

> wikipedia article of HTTP 403
> RFC 7231

更新

实际上,这不是100%明确的原因,因为RFC 7235说如果提供的凭据不正确,则可能会返回401.

标签:spring-boot,spring-security,spring,java
来源: https://codeday.me/bug/20191118/2031751.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有