春季启动返回 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-未经授权,即使我允许它的主要内容,如果未能解决你的问题,请参考以下文章
将 API 迁移到 .net Core 3 时出现 JWT 401 未经授权的错误