Java 弹簧靴csrf和翡翠
我有一个带有java配置的Spring启动应用程序。我在build.gradle文件中只引用了spring-boot-starter-jade4j和spring-boot-starter安全性。我正试图弄明白为什么我不能让csrf令牌出现。 这是我的安全配置Java 弹簧靴csrf和翡翠,java,spring,spring-mvc,spring-security,Java,Spring,Spring Mvc,Spring Security,我有一个带有java配置的Spring启动应用程序。我在build.gradle文件中只引用了spring-boot-starter-jade4j和spring-boot-starter安全性。我正试图弄明白为什么我不能让csrf令牌出现。 这是我的安全配置 @Configuration @EnableWebMvcSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired D
@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令牌似乎没有计算值,且值为空
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
我怀疑Spring Boot没有将CSRF令牌作为模型属性公开,这是意料之中的,因为令牌通常作为请求属性(而不是模型属性)公开。在典型的Spring MVC应用程序中,可以通过在
ViewResolver
上将ExposeRequestsAttributes
设置为true
来将请求属性作为模型属性公开。但是,我不确定如何使用Jade4j视图解析器实现这一点
但是,有一种解决方法,即通过应用程序配置手动公开令牌
@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)
}
}
}
}
}
现在,您的代码{{u csrf.parameterName}
和{u csrf.token}
将正常工作
注意:特别感谢。您是否尝试了
输入(type=“hidden”,name='{u csrf.parameterName},value='{u csrf.token}')
如中所述?所有这些:{u csrf.parameterName}{u csrf.token}{。对语法做了一些更改,这就做到了。作为一种解决方法,我在控制器中手动将令牌添加到我的视图中,但这样做更好,看起来更合适。JaDeviceWresolver确实有一个名为SetExposeRequestStatributes的方法,但是将其设置为true没有帮助。将exposerequestAttribute设置为true
可以解决此问题并在模型中公开_csrf对象。