Spring Security POST请求时的CSRF [已关闭]

os8fio9y  于 2023-02-04  发布在  Spring
关注(0)|答案(1)|浏览(168)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
7小时前关闭。
Improve this question
我正在尝试在Sping Boot 应用程序中实现CSRF保护。我创建了以下配置:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfiguration {
     @Bean
     public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            http
                .csrf()          
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                    .and()
                .authorizeRequests()
                    .antMatchers(HttpMethod.GET, "csrf").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .httpBasic();
            return http.build();
        }
}

和以下REST控制器来检索令牌:

@RestController
@RequestMapping("/csrf")
public class CsrfRestController {
//  @GetMapping
//    public void getCsrfToken(HttpServletRequest request) {
//        // https://github.com/spring-projects/spring-security/issues/12094#issuecomment-1294150717
//        CsrfToken csrfToken = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
//        csrfToken.getToken();
//    }
    
    @GetMapping 
    public CsrfToken getCsrfToken(CsrfToken token) {
        return token;   
    }
}

我可以让令牌对CSRF REST控制器执行GET,但当我尝试使用令牌从那里执行POST时,它仍然不工作,日志仍然给予我一个403错误,告诉我使用了无效的令牌,我错过了什么?
不确定是否相关,但用户/pwd/角色在application.properties中,因为我只需要一个用户,因为此API仅由我的Angular 前端使用。

spring.security.user.name=myuser
spring.security.user.password=mypass
spring.security.user.roles=ADMIN
bz4sfanl

bz4sfanl1#

如果你真的想显示你的crsf标记,那么你应该修改你的代码,在你的SpringSecurityConfiguration中的“csrf”前面缺少“/”:
.antMatchers(HttpMethod.GET, "/csrf").permitAll()
您的用户身份验证属性不相关。
您不必手动处理此问题,因为Spring Security会在所有请求中注入CSRF标头,尤其是安全端点(但不仅仅是安全端点)。使用浏览器(F12,网络选项卡)查看请求标头的运行情况。

相关问题