首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧靴csrf与玉石

弹簧靴csrf与玉石
EN

Stack Overflow用户
提问于 2015-07-14 21:52:27
回答 1查看 1K关注 0票数 4

我有一个带有java配置的Spring应用程序。我只在我的build.gradle文件中引用spring-boot-starter Jade4j和spring-boot-starter安全性。我想弄清楚为什么我不能让csrf令牌出现。这是我的SecurityConfig

代码语言:javascript
复制
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Autowired
  DataSource ds;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/signup", "/js/**", "/css/**", "/terms", "/privacy", "/favicon.ico").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
            .permitAll()
            .and()
        .csrf();
  }
…
}

这是我的登录表格。CSRF隐藏字段显示在源代码中,但csrf令牌似乎不计算,值为空。

代码语言:javascript
复制
extends _base
block head

block body
  #bodContent.container-fluid
  .row
    .col-md-4
    .col-md-4
      br
      .panel.panel-default
        .panel-body
          h1 Please log in
          form(method="POST", action="/login")
            input(type="hidden", name='_csrf', value='#{_csrf}')
            .form-group
              label(for="email")
                | Email address
              input#username.form-control(name="username", type="email", value="")
            .form-group
              label(for="password")
                | Password
              input#password.form-control(name="password", type="password", value="")
            .checkbox
              label
                input(type="checkbox")
                | Remember me
            input.btn.btn-default(type="submit")
              | Submit
    .col-md-4
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-16 09:35:09

我怀疑Spring没有将CSRF令牌公开为模型属性,这是可以预期的,因为令牌通常是作为请求属性(而不是模型属性)公开的。在典型的Spring应用程序中,通过将exposeRequestAttributes设置为ViewResolver上的true,可以将请求属性公开为模型属性。但是,我不确定如何使用Jade4j视图解析器来完成这一任务。

不过,有一个解决办法,就是通过应用程序配置手动公开令牌。

代码语言:javascript
复制
@Configuration
@EnableAutoConfiguration
public class ApplicationConfig extends WebMvcConfigurerAdapter {
  public static void main(String... args) {
    SpringApplication.run(ApplicationConfig.class, args);
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(csrfTokenAddingInterceptor());
  }

  @Bean
  public HandlerInterceptor csrfTokenAddingInterceptor() {
    return new HandlerInterceptorAdapter() {
      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView view) {
        CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class.getName())
        if (token != null) {
          view.addObject(token.getParameterName(), token)
        }
      }
    }
  }
}

现在,您的代码#{_csrf.parameterName}#{_csrf.token}将工作。

Notethis answer的特殊信贷。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31418038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档