x-csrf-token不是由springbooot生成的

axkjgtzd  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(431)

我跟随导游来到这里:http://spring.io/guides/gs/rest-service/ 为了构建我的rest服务示例,现在我正在尝试启用csrf保护。我读到它应该在默认情况下启用,所以如果我不包括:
http.csrf().disable()
在我的 WebSecurityConfigurerAdapter 配置时,默认情况下应启用csrf保护,但情况似乎并非如此。问题是没有生成x-csrf-token,也没有以任何方式包含在我的http响应中。我应该怎么做,生成x-csrf-token并将其包含在响应中,当然,csrf保护完全工作?
我注意到,使用类似的spring mvc配置,生成的x-csrf-token只包括:
< security:csrf disabled=“假”/>
在我的安全配置文件中。但是,使用springboot可能我出了什么问题,并且没有办法生成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);
}
gv8xihay

gv8xihay1#

要在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());}
k97glaaz

k97glaaz2#

使用springsecurity5.3.0.final,生成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框架,则需要通过在请求头中设置令牌来包含该令牌。
下面是jqueryajax调用的示例。

// 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公司

nbnkbykc

nbnkbykc3#

我们在安全测试中遇到了类似的问题,我们怀疑在websecurityconfig类的configure方法中意外禁用了csfr,默认情况下它是启用的。通过如下所示更改congfigure方法,我们让spring自动生成csfr令牌。
WebSecurity配置类配置方法==>

@Override
protected void configure(HttpSecurity http) throws Exception {              

     http
     .authorizeRequests()
         .antMatchers("/", "/login","/loginError","/home","/interruption").permitAll()                                                          
         .antMatchers("/admin").hasAuthority(Roles.ROLE_PREFIX.role()+Roles.HALLEYYNT01.role())  
         .antMatchers("/requests").hasAuthority(Roles.ROLE_PREFIX.role()+Roles.CCHALLEYLOGIN.role())
         .antMatchers("/solrequests").hasAuthority(Roles.ROLE_PREFIX.role()+Roles.SOLHALLEYLOGIN.role())
         .anyRequest().authenticated()
         .and()
     .formLogin()             
         .loginPage("/login")  
         //.failureUrl("/loginError")
         .loginProcessingUrl("/authenticate")
         .defaultSuccessUrl("/")            
         .and()
     .logout().clearAuthentication(true).invalidateHttpSession(true).deleteCookies("JSESSIONID")         
         .logoutSuccessUrl("/login");
         //.and() 
     //.exceptionHandling().accessDeniedHandler(accessDeniedHandler);    
}

相关问题