我的目标是将 CSRF 添加到 STOMP 标头中。
我尝试过的方法确实有效,但我不确定是否应该使用它,因为我没有在 Spring Security Reference 中找到此解决方案:
WebSecurityConfig.java
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
我尝试过的:
CsrfController.java
@RestController
public class CsrfController {
@RequestMapping("/csrf")
public CsrfToken csrf(CsrfToken token) {
return token;
}
}
WebSecurityConfig.java
@EnableWebSecurity // for endpoint GET /csrf to work.
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/csrf").permitAll();
}
}
CsrfController.java
@RestController
public class CsrfController {
@RequestMapping("/csrf")
public String csrf(HttpServletRequest request) {
CsrfToken token = (CsrfToken)request.getAttribute(CsrfToken.class.getName());
return token.getToken();
}
}
我的预期结果是:GET /csrf 端点返回令牌值。
我的实际结果是:响应是“内部服务器错误”,还有一个错误日志。
java.lang.IllegalStateException: No primary or single public constructor found for interface org.springframework.security.web.server.csrf.CsrfToken - and no default constructor found either