我一直在遵循https://programmingtechie.com/2019/11/08/build-a-full-stack-reddit-clone-with-spring-boot-and-angular-part-3/的教程。
由于某种原因,即使我禁用了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);
}
这是在SecurityConfig
类上扩展WebSecurityConfigurerAdapter
。
下面是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
类。
@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;
}
有人能指出错误吗?还是我需要做更多的配置?
3条答案
按热度按时间0mkxixxg1#
修复:从HttpSecurity配置中删除cors()。
我在学习这个教程的时候遇到了同样的问题。坦白的说,即使我是新的spring-boot新手。我尝试了不同的方法来解决这个问题,这个方法对我来说很有帮助。我不知道为什么这个方法能解决这个问题。需要深入研究这个方法。但是我希望这个方法能帮助你在这个教程中前进。
wwtsj6pe2#
我也遇到过同样的问题,但对于我的情况,我在LoginRequest类中拼错了我的属性
那么这是我从 Postman 那里要尸体
我也是新来的,但理解的React实际上会帮助你很多,我希望它有助于其他人面临同样的问题。
cfh9epnr3#
我遇到了同样的问题。有各种各样的原因导致了这种情况的发生。在我尝试了其他人说的方法后,它仍然无法解决。如果你仍然遇到类似的问题。**尝试调试它,自己找到根源。**以下是我的步骤,
1.在设置403状态的行上放置一个断点,以从堆栈帧中查看这是如何发生的。
假设它返回403,没有其他信息,但它必须设置响应的状态,对吗?因此,将断点放在setStatus方法中,我不知道它应该放在哪里,在tomcat库、spring库或servlet库中。检查
HttpResponse
,它们是几个实现,为那些setStatus/setCode方法设置断点。(接下来,您可以看到它实际上发生在HttpResponseWrapper::setStatus
)2.分析堆栈帧以查看其中发生了什么
断点命中后,堆栈帧显示得非常清楚。下面是我在断点命中时使用VS代码得到的结果:
你可以看到根本原因是CorsFilter,我发现允许源没有设置。设置
cors.allowed.origins
字段后,问题就消失了。希望你也能解决你的问题。