春季启动返回 401-未经授权,即使我允许它

Posted

技术标签:

【中文标题】春季启动返回 401-未经授权,即使我允许它【英文标题】:Spring boot returns 401- Unauthorized even though I have allowed it 【发布时间】:2021-03-31 14:04:11 【问题描述】:

我正在尝试通过 Postman 访问我的 API。在配置中,我已将 /authenticate 设置为允许,但我一直得到 401 未授权。

相关函数:

@Override
    protected void configure(HttpSecurity httpSecurity) throws Exception 
        httpSecurity
                // dont authenticate this particular request
                .authorizeRequests().antMatchers("/authenticate").permitAll().
                // all other requests need to be authenticated
                        anyRequest().authenticated().and().
                // make sure we use stateless session; session won't be used to
                // store user's state.
                        exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        // Add a filter to validate the tokens with every request
        httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    

我的依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
        <version>2.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
</dependencies>

任何帮助将不胜感激

【问题讨论】:

通常您希望从安全检查中排除身份验证 URL。更多详情请查看:***.com/questions/22767205/… 还要确保过滤器正常工作。例如。尝试通过请求另一个资源而不是 /authenticate 使用有效令牌来验证用户。 有时由于 csrf 和 cors 的问题会发生这种情况,请尝试将 .csrf().disable().cors() 添加到您的 httpSecurity 对象 @PabloAndrésRodasGiraldo 感谢您的建议,但我仍然得到相同的结果 【参考方案1】:

这里的问题是,即使您将 Spring Security 配置为允许每个用户,您的请求也会通过与其他请求相同的安全链。我猜您对身份验证端点的调用在授权标头中不包含任何内容,或者换句话说,您的令牌是空的,因此您得到的是 401。在这种情况下,一种解决方案可以是说 spring用于身份验证的 URL 的安全性,请求不会通过安全链。您可以在 Spring Security 配置中使用以下代码来实现。

@Override
public void configure(WebSecurity web) throws Exception 
    web.ignoring().antMatchers("/authenticate");

我希望这可以解决您的问题。

【讨论】:

以上是关于春季启动返回 401-未经授权,即使我允许它的主要内容,如果未能解决你的问题,请参考以下文章

Django Tastypie 总是返回 401 未经授权

将 API 迁移到 .net Core 3 时出现 JWT 401 未经授权的错误

为啥我的未经授权的控制器不返回 401 ASP.Net Core?

删除和选项请求获得 401 未授权响应

远程服务器返回错误:(401)在Zendesk中未经授权

React - 带有标头的 ajax GET 请求仍返回 401(未经授权)