Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 添加';授权';标头使Spring Security保护允许的端点_Java_Spring Boot_Http_Spring Security_Basic Authentication - Fatal编程技术网

Java 添加';授权';标头使Spring Security保护允许的端点

Java 添加';授权';标头使Spring Security保护允许的端点,java,spring-boot,http,spring-security,basic-authentication,Java,Spring Boot,Http,Spring Security,Basic Authentication,因此,我在我的websecurityConfigureAdapter public class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http // Use this confi

因此,我在我的
websecurityConfigureAdapter

public class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                // Use this configuration for endpoints starting with 'api'
                .antMatcher("/api/**")
                // Do not secure endpoints receiving callbacks
                .authorizeRequests().antMatchers(""/api/v1/notification").permitAll()
                // Allow only users with role "ROLE_API"
                .anyRequest().hasRole(Users.UserRoles.ROLE_API.role.replace("ROLE_", ""))
                .and()
                .httpBasic()
                .and()
                // Do not create any sessions
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                // Disable csrf
                .csrf().disable();            

    }
}

不应保护
/api/v1/notification
。如果我在
HTTP
标题中未经
Authorization:Basic bai zhi
调用该端点,则允许请求,但如果我添加
Authorization:Basic bai
标题,则会得到
401
HTTP响应代码

注意:
Basic abcd
只是随机的,所以我的数据库中没有这样的用户


问题是,为什么在http头中添加
授权…
会使端点再次受到保护?

好问题,这可能有点令人困惑,因为这意味着一个合法的客户端,只要密码不正确,就可能被拒绝一个世界上其他地方都可以看到的没有凭据的页面

实际上,这是设计的。一般来说,授权系统需要知道用户是谁,然后才能知道用户是否可以执行X、Y或Z操作。即使使用公共端点,当用户处于上下文中时,端点的行为也可能有所不同。因此,实际上,它们是先进行身份验证的独立系统:如果请求提供凭据,那么框架将尝试对用户进行身份验证,并相应地接受或拒绝请求

选择权 我知道您没有问如何解决这个问题(您可能对该行为完全满意,只是好奇),但您可以使用
BasicAuthenticationFilter
将其配置为忽略故障,仅针对该端点:

static class IgnoreFailuresBasicAuthenticationFilter extends BasicAuthenticationFilter {
    private final BasicAuthenticationFilter everythingElse;

    public IgnoreFailuresBasicAuthenticationFilter(BasicAuthenticationFilter everythingElse) {
        super(everythingElse.getAuthenticationManager());
        this.everythingElse = everythingElse;
    }

    protected void doFilterInternal(request, response, chain) {
        if ("/api/v1/notification".equals(request.getPathInfo())) {
            super.doFilterInternal(request, response, chain);
        } else {
            this.everythingElse.doFilterInternal(request, response, chain);
        }
    }
}
然后更换DSL中的过滤器:

http
    .httpBasic()
        .withObjectPostProcessor(
            new ObjectPostProcessor<BasicAuthenticationFilter>() {
                public BasicAuthenticationFilter postProcess(BasicAuthenticationFilter filter) {
                    return new IgnoreFailuresBasicAuthenticationFilter(filter);
                }
            });
http
.httpBasic()
.withObjectPostProcessor(
新的ObjectPostProcessor(){
公共基本身份验证过滤器后处理(基本身份验证过滤器){
返回新的信号故障基本身份验证过滤器(过滤器);
}
});

这将允许筛选器链继续,即使基本身份验证失败。其结果是,如果身份验证失败,您将得到403而不是401。

用户在上下文中的行为是否不同,或者两种方式是否相同?它仍然充当安全端点。如果存在http头
授权
。我忘了问如何解决它(掌心)。解释得很好。谢谢。这两个都
everythings.getAuthenticationManager()
.doFilterInternal
BasicAuthenticationFilter
中有
受保护的
访问权限。我如何绕过它?事实上,我找到了一个解决方案:1.我不是通过
BasicAuthenticationFilter
,而是通过
身份验证管理器
2.在
if
部分,我正在调用
chan.do过滤(请求、响应)
3.调用
else
第一部分
super.doFilterInternal(请求、响应、链)