当前位置: 首页 > 知识库问答 >
问题:

X-CSRF-TOKEN不是由Spring Boot生成的

堵鸿光
2023-03-14

我遵循指南:http://spring.io/guides/gs/rest-service/构建我的Rest服务示例,现在我正在尝试启用CSRF保护。我读到它应该默认启用,所以如果我不包括:

http。csrf()。禁用()

在我的websecurityConfigureAdapter配置中,默认情况下应该启用CSRF保护,但情况似乎并非如此。问题是X-CSRF-TOKEN没有生成,也没有以任何方式包含在我的HTTP响应中。我应该怎么做,生成x-csrf-token并将其包含在响应中,当然,csrf保护完全工作?

我注意到,通过类似的spring mvc配置,我生成了x-csrf-token,其中包括:

在我的安全配置文件中。但是,在Spring启动中,我可能出错了,没有办法生成csrf令牌。有人能帮我吗,也许给我一个工作示例?我的安全配置是:

     @Override
     protected void configure(HttpSecurity http) throws Exception 
     {
        http
      // .csrf().disable()
      .authorizeRequests()
          .anyRequest()
          .authenticated()
      .and()
      .httpBasic()
      .authenticationEntryPoint(new RestAuthenticationEntryPoint())
      .and()
      .formLogin()
      .successHandler(new RestAuthenticationSuccessHandler())
      .failureHandler(new SimpleUrlAuthenticationFailureHandler())
      .and()
      .logout()
      .logoutSuccessHandler(new RestLogoutSuccessHandler());
}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception 
{
    auth.userDetailsService(restUserDetailService);
}

共有3个答案

谭毅然
2023-03-14

您可以配置CookieSRFTokenRepository。将CSRF令牌存储在具有Java配置的Cookie中

    @Override
    protected void configure(HttpSecurity http) {
        http
            .csrf(csrf ->
                csrf
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            );
    }
叶琦
2023-03-14

使用Spring Security 5.3.0。最后,生成CSRF令牌的方法之一是使用下面的代码在cookie中设置它。

 http.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))

您还需要在服务器授权请求中包含生成的CSRF令牌。

<form>
    <input type="hidden" name="_csrf" value="${cookie['XSRF-TOKEN'].getValue()}" />
    //Code goes here
</form>

在使用JS框架的情况下,需要通过在请求头中设置令牌来包含令牌。

下面是一个JQuery ajax调用的示例。

// Get the CSRF token from the cookie
const csrfCookie= document.cookie.replace(/(?:(?:^|.*;\s*)XSRF-TOKEN\s*\=\s*([^;]*).*$)|^.*$/, '$1');
// Add the CSRF token to each ajax request header
settings.beforeSend = function(xhr) {
  xhr.setRequestHeader('X-XSRF-TOKEN', springCsrfCookie);
};
$.ajax(settings);

还有其他的实现可以满足您的需求,下面的链接由Spring|https://docs.spring.io/spring-security/site/docs/5.3.0.RELEASE/reference/html5/#servlet-csrf

澹台庆
2023-03-14

要在CSRF保护中包含CSRF令牌,可以包含CSRFTokenRepository以生成令牌。在您的案例中,添加一条简单的线就足够了:

 @Override
 protected void configure(HttpSecurity http) throws Exception 
 {
  http.
  .csrf()
  .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) //HERE !  Defaults XSRF-TOKEN as cookie name and X-XSRF-TOKEN as header name  
  .authorizeRequests()
  .anyRequest()
  .authenticated()
  .and()
  .httpBasic()
  .authenticationEntryPoint(new RestAuthenticationEntryPoint())
  .and()
  .formLogin()
  .successHandler(new RestAuthenticationSuccessHandler())
  .failureHandler(new SimpleUrlAuthenticationFailureHandler())
  .and()
  .logout()
  .logoutSuccessHandler(new RestLogoutSuccessHandler());}
 类似资料:
  • 我尝试与使用Laravel构建的REST API对话。但由于令牌不匹配,与邮递员的通话被拒绝。我想我需要在标题中包含CSRF标记。但我需要加密的吗?当我插入这个令牌时,仍然会得到一个错误,即存在令牌不匹配。 我使用以下方法检索令牌: 但每次刷新时都应该改变吗?

  • JSON WEB TOKEN 生成令牌,扩展 egg 中的 app 对象,使用 app.generateToken() 生成 token const jwt = require('jsonwebtoken'); module.exports = { /** * 生成 Token * @param { Object } params */

  • 配置Spring Security 3.2后,csrf。令牌未绑定到请求或会话对象。 这是Spring Security配置: login.jsp文件 它呈现下一个html: 结果是403 HTTP状态: 在一些调试之后更新,请求对象以良好的形式发出DelegatingFilterProxy,但在CoyoteAdapter的469行中,它执行请求。回收();这会删除所有属性。。。 我使用JDK 1

  • cmf_generate_user_token($userId, $deviceType) 功能 生成用户 token 参数 $userId: int 用户 ID $deviceType: string 设备类型(mobile,android,iphone,ipad,web,pc,mac,wxapp) 返回 string 生成的用户token

  • 我使用的是一个第三方库,它生成了一个原始的和。 这绕过了我的CSRF保护,并被我的rails服务器击落。 是否有方法在实例化时向的所有实例全局添加预定义的CSRF令牌()?

  • 但是在日志中,我看到CSRF令牌在向/login发布凭据时无效。