SpringBoot为移动请求抛出403,即使csrf被禁用

v2g6jxz6  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(644)

我有一个简单的spring启动应用程序,它有一个post-restapi方法来注册用户。当我通过 Postman 测试它时,它工作得非常好。但是当我从我的移动应用程序测试它时,它总是抛出一个403。这在选项级别失败,因为我没有看到后端记录尝试的请求。
对于这个问题,通常的解决方法是禁用 csrf 在spring安全配置中。有趣的是,我有这个残疾,而且还拿着403。我已经尽我所能寻找了很多,但找不到一个解决办法,这是如何仍然失败。感谢任何人能提供的帮助。
这是安全配置。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    // Some beans that are not relevant

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/register").permitAll()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and().exceptionHandling().accessDeniedHandler(accessDeniedHandler)
                .and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }
}

我认为值得一提的是,我还尝试添加 cors 在许多其他线程中建议禁用选项,但没有效果。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable()
                .authorizeRequests()
                .antMatchers("/register").permitAll()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and().exceptionHandling().accessDeniedHandler(accessDeniedHandler)
                .and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }

这就是我的控制器的样子

@RestController
public class AuthenticationResource {

    // Wiring and other methods

    @RequestMapping(value = "/register", method = RequestMethod.POST)
    public ResponseEntity<?> registerNewUser(@Valid @RequestBody UserRegistrationRequest request) {
        if (!request.getConfirmPassword().equals(request.getPassword())) {
            throw new MyException(ErrorUtil.generateErrorFieldsValue("password", "confirmPassword"),
                    "Passwords do not match!", HttpStatus.BAD_REQUEST);
        }

        UserAccountResponse savedUserAccount = userAccountService.save(request);
        return ResponseEntity.ok(savedUserAccount);
    }
}

如果需要其他细节,请告诉我。

b5lpy0ml

b5lpy0ml1#

据我所知,这与您建议的cors有关,但使用 http.cors() 你让spring去找一个叫 corsFilter() . 在我的其他项目中,我就是这样解决的。

@Bean
    public CorsFilter corsFilter() {

        UrlBasedCorsConfigurationSource configSource = new 
        UrlBasedCorsConfigurationSource();

        CorsConfiguration config = new CorsConfiguration();

        // GET , POST, HEAD
        config.applyPermitDefaultValues();

        config.addAllowedMethod(HttpMethod.PUT);
        config.addAllowedMethod(HttpMethod.DELETE);
        config.addAllowedMethod(HttpMethod.OPTIONS);

        configSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(configSource);
    }

相关问题