spring-security 即使禁用了csrf,Spring安全403禁止错误仍持续发生

b5lpy0ml  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(282)

我一直在遵循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;
    }

有人能指出错误吗?还是我需要做更多的配置?

0mkxixxg

0mkxixxg1#

修复:从HttpSecurity配置中删除cors()。
我在学习这个教程的时候遇到了同样的问题。坦白的说,即使我是新的spring-boot新手。我尝试了不同的方法来解决这个问题,这个方法对我来说很有帮助。我不知道为什么这个方法能解决这个问题。需要深入研究这个方法。但是我希望这个方法能帮助你在这个教程中前进。

wwtsj6pe

wwtsj6pe2#

我也遇到过同样的问题,但对于我的情况,我在LoginRequest类中拼错了我的属性

public class LoginRequest{
  private String username;
  private String passsword; // i put 3's'
}

那么这是我从 Postman 那里要尸体

{
  "username":"name"
  "password":"123" // i put 2 's'
}

我也是新来的,但理解的React实际上会帮助你很多,我希望它有助于其他人面临同样的问题。

cfh9epnr

cfh9epnr3#

我遇到了同样的问题。有各种各样的原因导致了这种情况的发生。在我尝试了其他人说的方法后,它仍然无法解决。如果你仍然遇到类似的问题。**尝试调试它,自己找到根源。**以下是我的步骤,

1.在设置403状态的行上放置一个断点,以从堆栈帧中查看这是如何发生的。

假设它返回403,没有其他信息,但它必须设置响应的状态,对吗?因此,将断点放在setStatus方法中,我不知道它应该放在哪里,在tomcat库、spring库或servlet库中。检查HttpResponse,它们是几个实现,为那些setStatus/setCode方法设置断点。(接下来,您可以看到它实际上发生在HttpResponseWrapper::setStatus

2.分析堆栈帧以查看其中发生了什么

断点命中后,堆栈帧显示得非常清楚。下面是我在断点命中时使用VS代码得到的结果:

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字段后,问题就消失了。希望你也能解决你的问题。

相关问题