[英]Spring security 403 forbidden error keeps happening even with csrf disable
并且由于某种原因,即使我禁用了 csrf, /auth/api/login
REST-API 也会不断抛出 403 禁止错误(访问被拒绝)。
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**")
.permitAll()
.anyRequest()
.authenticated();
httpSecurity.addFilterBefore(jwtAuthenticationFilter,
UsernamePasswordAuthenticationFilter.class);
}
这是在扩展WebSecurityConfigurerAdapter
的SecurityConfig
class 上。
下面是AuthController
。
@RestController
@RequestMapping("/api/auth")
@AllArgsConstructor
public class AuthController {
private final AuthService authService;
private final RefreshTokenService refreshTokenService;
@PostMapping("/signup")
public ResponseEntity<String> signup (@RequestBody RegisterRequest registerRequest) {
authService.signup(registerRequest);
return new ResponseEntity<>("User Registration Successful", HttpStatus.OK);
}
@PostMapping("/login")
public AuthenticationResponse login(@RequestBody LoginRequest loginRequest) {
return authService.login(loginRequest);
}
@GetMapping("accountVerification/{token}")
public ResponseEntity<String> verifyAccount(@PathVariable String token) {
authService.verifyAccount(token);
return new ResponseEntity<>("Account Activated Successfully", OK);
}
当我尝试请求http://localhost:8080/api/auth/signup
时,它工作得很好,但http://localhost:8080/api/auth/login
不断返回 403 禁止错误。
需要明确的是,下面是JwtAuthenticationFilter
class。
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String jwt = getJwtFromRequest(request);
if (StringUtils.hasText(jwt) && jwtProvider.validateToken(jwt)){
String username = jwtProvider.getUsernameFromJwt(jwt);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails,
null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
private String getJwtFromRequest(HttpServletRequest request){
String bearerToken = request.getHeader("Authorization");
if(StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")){
return bearerToken.substring(7);
}
return bearerToken;
}
有人可以指出错误还是我需要做更多的配置?
修复:从 HttpSecurity 配置中删除 cors()。
在学习本教程时,我遇到了同样的问题。 坦率地说,即使我是新 spring-boot 的新手。 正在尝试不同的方法来解决这个问题,这对我来说是一个点击。 我不确定为什么这可以解决问题。 需要深入研究这一点。 但我希望这个可以帮助您在本教程中继续前进。
我遇到了同样的问题,但就我而言,我在 LoginRequest class 中拼错了我的属性
public class LoginRequest{
private String username;
private String passsword; // i put 3's'
}
那么这是我来自 postman 的请求正文
{
"username":"name"
"password":"123" // i put 2 's'
}
我对此也很陌生..但了解回复实际上会对您有很大帮助,我希望它可以帮助其他面临同样问题的人..
我遇到了同样的问题。 有多种原因可以做到这一点。 试了别人说的,还是不能解决。 如果你仍然被类似的问题绊倒。 尝试调试它,自己找到根本原因。 这是我所做的步骤,
1. 在设置 403 状态的行上放置一个断点,从堆栈帧中查看这是如何发生的。
猜猜它返回 403 没有太多其他信息,但它必须需要将状态设置为响应,对吧? 所以在 setStatus 方法中放一个断点,我不知道它应该在哪里,在 tomcat 库、spring 库或 servlet 库中。 检查HttpResponse
,它们是几个实现,为那些 setStatus/setCode 方法设置断点。 (接下来你可以看到它确实发生在HttpResponseWrapper::setStatus
)
2. 分析堆栈帧以查看发生了什么
断点命中后,堆栈帧显示非常清晰。 这是我在断点命中时使用 VS Code 得到的结果:
HttpServletResponseWrapper.setStatus(int) (\javax.servlet-api-4.0.1.jar\javax.servlet.http\HttpServletResponseWrapper.class:201)
CorsFilter.handleInvalidCORS(HttpServletRequest,HttpServletResponse,FilterChain) (\tomcat-embed-core-9.0.65.jar\org.apache.catalina.filters\CorsFilter.class:376)
CorsFilter.handleSimpleCORS(HttpServletRequest,HttpServletResponse,FilterChain) (\tomcat-embed-core-9.0.65.jar\org.apache.catalina.filters\CorsFilter.class:252)
CorsFilter.doFilter(ServletRequest,ServletResponse,FilterChain) (\tomcat-embed-core-9.0.65.jar\org.apache.catalina.filters\CorsFilter.class:168)
GeneratedMethodAccessor141.invoke(Object,Object[]) (Unknown Source:-1)
您可以看到根本原因是 CorsFilter,我发现未设置允许来源。 设置cors.allowed.origins
字段后,问题就消失了。 希望你也能解决你的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.