即使禁用 csrf,Spring security 403 禁止错误也会不断发生

Posted

技术标签:

【中文标题】即使禁用 csrf,Spring security 403 禁止错误也会不断发生【英文标题】:Spring security 403 forbidden error keeps happening even with csrf disable 【发布时间】:2020-10-10 08:39:41 【问题描述】:

我一直在关注https://programmingtechie.com/2019/11/08/build-a-full-stack-reddit-clone-with-spring-boot-and-angular-part-3/ 的教程。

由于某种原因,/auth/api/login REST-API 一直抛出 403 禁止错误(访问被拒绝),即使我禁用了 csrf。

    @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);
    

这是在扩展 WebSecurityConfigurerAdapterSecurityConfig 类上。

下面是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;
    

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

【问题讨论】:

您是否尝试过在安全配置中使用 .antMatchers("/auth/api/**") ? 由于您能够执行 /signup,/login 应该可以工作,请确保您输入了正确的凭据并根据需要使用了密码编码器(可能是 Bcypt) 请注意,Spring Security 附带了对 JWT 的内置支持,因此最简单的方法可能是参考资源服务器 [1] 和 JWT 登录 [2] 示例。 [1] - github.com/spring-projects/spring-security-samples/tree/master/…, [2] - github.com/spring-projects/spring-security-samples/tree/master/… 【参考方案1】:

我遇到了同样的问题,但就我而言,我在 LoginRequest 类中拼错了我的属性

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

那么这是我来自邮递员的请求正文


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

我对此也很陌生..但了解回复实际上会对您有很大帮助, 我希望它可以帮助其他面临同样问题的人..

【讨论】:

【参考方案2】:

修复:从 HttpSecurity 配置中删除 cors()。

我在学习本教程时遇到了同样的问题。坦率地说,即使我是新春靴的新手。正在尝试不同的方法来解决这个问题,这对我来说是一个点击。我不确定为什么这可以解决问题。需要深入研究这一点。但我希望这篇文章可以帮助您在本教程中继续前进。

【讨论】:

以上是关于即使禁用 csrf,Spring security 403 禁止错误也会不断发生的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 3.2 CSRF 禁用特定 URL

如何仅在 localhost 的 Spring Security 中禁用 csrf?

CSRF 禁用在 Spring Security 中不起作用

如何通过 XML 配置仅针对特定 URL 模式在 Spring Security 4 中禁用 CSRF?

Spring-Security对CSRF攻击的支持

即使禁用 csrf,Spring Boot 也会为移动请求抛出 403