在Spring Controller中获取_csrf

0bj*_*3ct 4 java spring spring-mvc csrf spring-security

如何在Spring Controller中获取_csrf对象(?!)?我已经配置了Spring Security,可以在jsp文件中获得$ {_ csrf}请求属性。我试过了:

CsrfToken _csrf = (CsrfToken) session.getAttribute("CsrfToken");
CsrfToken _csrf = (CsrfToken) session.getAttribute("_csrf");
Run Code Online (Sandbox Code Playgroud)

结果为空;

提前致谢!

Rup*_*ott 7

要访问 Spring 控制器中的 CSRF 令牌,您可以简单地执行以下操作:

@Controller
public class FooController {
    @RequestMapping("/foo")
    public void foo(CsrfToken token) {
        // Do whatever with token
    }
}
Run Code Online (Sandbox Code Playgroud)

Spring将根据参数的类型自动检测您是否需要令牌,并将其注入到您的方法中。

至少从 Spring Security 5.0 开始,如果您使用 Spring Boot 或@EnableWebSecurity在配置中包含注释,则此方法有效。

文档


0bj*_*3ct 6

在调试中,我看到了带有键“ org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN”的会话属性。我查看了HttpSessionCsrfTokenRepository类。它具有从传入的HttpServletRequest对象加​​载令牌的方法。

最后,这对我有用:

CsrfToken token = new HttpSessionCsrfTokenRepository().loadToken(request);
Run Code Online (Sandbox Code Playgroud)

如果有人向我解释了它的工作原理,我将不胜感激。