自动将 CSRF Token 添加到 Spring Boot JTE 主模板的最佳方法

问题描述 投票:0回答:1

我喜欢新的模板引擎 JTE,我正在努力学习它。

我知道我可以手动添加 CSRF 令牌作为请求属性,并且我已经为我的登录表单完成了此操作,如下所示:

@GetMapping("/login")
    public String login(Model model, CsrfToken token) {
        model.addAttribute("csrf", token.getToken());
        return "auth/login";
    }

@param String title
@param String csrf

@template.main-layout(title = title, content = @`
    <form action="/login" method="POST">
        <div>
            <input type="text" name="username" placeholder="Username: ">
        </div>
        <div>
            <input type="password" name="password" placeholder="Username: ">
        </div>
        <div>
            <input type="hidden" name="_csrf" value="${csrf}">
        </div>
        <div>
            <input type="submit" value="Log in" />
        </div>
    </form>
`)

但是在我的虚拟项目的主布局文件中,我想要一个条件,基本上检查用户是否经过身份验证,如果是,我想显示一个注销按钮,否则显示一个登录链接。

现在,我不想将 CSRF 令牌作为每个视图的 @param 传递,这会很烦人,

有没有好的方法可以直接在模板中实现这个?

否则我很高兴学习如何为开源做出贡献并尝试构建它, 或者我可能只需要学习百里香,因为我认为它具有开箱即用的功能

spring-boot spring-security csrf template-engine jte
1个回答
0
投票

到目前为止我发现的最好的方法是使用@ControllerAdvice

    import org.springframework.security.web.csrf.CsrfToken;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ModelAttribute;
    
    @ControllerAdvice
    public class JteControllerAdvice {
        
        @ModelAttribute
        public void csrf(Model model, CsrfToken csrf) {
            model.addAttribute("_csrf", csrf);
        }
    }

您还可以使用@ControllerAdvice仅针对特定控制器。

© www.soinside.com 2019 - 2024. All rights reserved.