【问题标题】:How to use Spring Security with Mustache?如何将 Spring Security 与 Mustache 一起使用?
【发布时间】:2014-12-11 09:26:05
【问题描述】:

我正在关注 Spring Security 参考,并且我已经重定向到自定义登录页面,如section 3.3 中所述。但是,我不确定如何在 Mustache 中获取 CSRF 令牌(所有示例都使用 JSP)。我已经尝试过一些像这样天真的事情......

{{#_csrf}}
    <input type="hidden" name="{{parameterName}}" value="{{token}}"/>
{{/_csrf}}

...还有这个...

{{#CsrfToken}}
    <input type="hidden" name="{{parameterName}}" value="{{token}}"/>
{{/CsrfToken}}

...但是它们不起作用(而且我真的没想到它们会起作用)。如何在 Mustache 中获取 CSRF 令牌?

我也想知道:我在哪里可以在我的代码中设置断点,以查看 Spring Security 将什么作为模型发送到我的自定义登录视图?)

【问题讨论】:

  • Spring Security 不发送模型;这就是 Spring MVC DispatcherServlet。如果您要使用没有开箱即用集成的模板引擎(例如 Mustache),则需要在控制器中查找 CSRF 令牌并自己将其添加到模型中。跨度>
  • @chrylis - 你说对了;谢谢你的帮助。我在@RequestMapping 处理程序方法中添加了一个HttpServletRequest 参数,并从“_csrf”属性中获得了CsrfToken 的一个实例。如果您添加答案,我会接受。
  • 像这样:CsrfToken token = (CsrfToken) httpServletRequest.getAttribute("_csrf"); model.addAttribute("token", token.getToken()); stackoverflow.com/questions/20862299/…

标签: java spring-mvc spring-security mustache


【解决方案1】:

将此添加到您的application.properties

spring.mustache.expose-request-attributes=true

然后您可以访问模板中的_csrf 请求属性。

【讨论】:

    【解决方案2】:

    我不确定从哪个版本可用,但您可以在控制器方法中为 CsrfToken 添加一个参数,以获取要传递给模型的令牌,如下所示:

    @GetMapping("/dashboard")
    public String dashboard(CsrfToken csrfToken, Model model) {
        model.addAttribute("_csrf", csrfToken);
        // render page
    }
    

    您不必使用HttpServletRequest。现在您可以使用您的第一个模板了。


    如果上面的每个控制器方法都太繁琐,我们可以注册一个拦截器。

    拦截器:

    public class CsrfTokenInterceptor implements HandlerInterceptor {
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response,
                               Object handler, ModelAndView modelAndView) throws Exception {
            CsrfToken csrfToken = (CsrfToken) request.getAttribute("_csrf");
            if (modelAndView != null) {
                modelAndView.addObject("_csrf", csrfToken);
            }
        }
    }
    

    豆子:

    @Configuration
    public class Config {
        @Bean
        public CsrfTokenInterceptor csrfTokenInterceptor() {
            return new CsrfTokenInterceptor();
        }
    }
    

    在 WebMvcConfigurer 中添加拦截器:

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Autowired
        CsrfTokenInterceptor csrfTokenInterceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(csrfTokenInterceptor);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-04
      • 2018-04-14
      • 2020-11-02
      • 2021-09-03
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多