Как использовать Spring Security с усами?

Я следую справочнику Spring Security, и у меня есть перенаправление на настраиваемую страницу входа, работающую, как описано в раздел 3.3. Однако я не уверен, как получить токен CSRF в Mustache (во всех примерах используется JSP). Я пробовал несколько наивных вещей, подобных этому...

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

...и это...

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

... но они не работают (да я и не ожидал). Как я могу получить токен CSRF в Mustache?

Мне также интересно: где я могу установить точку останова в своем коде, чтобы увидеть, что Spring Security отправляет в качестве модели для моего пользовательского представления входа в систему?)


person Rob Johansen    schedule 16.10.2014    source источник
comment
Spring Security не отправляет модель; это Spring MVC DispatcherServlet. Если вы собираетесь использовать механизм шаблонов, такой как Mustache, который не имеет встроенной интеграции, вам нужно будет найти токен CSRF в своем контроллере и самостоятельно добавить его в модель.   -  person chrylis -cautiouslyoptimistic-    schedule 16.10.2014
comment
@chrylis - Вы были правы; Спасибо за вашу помощь. Я добавил аргумент HttpServletRequest в свой метод обработчика @RequestMapping и получил экземпляр CsrfToken из атрибута _csrf. Если вы добавите ответ, я приму его.   -  person Rob Johansen    schedule 17.10.2014
comment
Вот так: токен CsrfToken = (CsrfToken) httpServletRequest.getAttribute(_csrf); model.addAttribute (токен, token.getToken()); stackoverflow.com/questions/20862299/   -  person sanrodari    schedule 15.04.2015


Ответы (2)


Добавьте это к вашемуapplication.properties:

spring.mustache.expose-request-attributes=true

Затем у вас есть доступ к атрибуту запроса _csrf в вашем шаблоне.

person smiggle    schedule 05.11.2019

Я не уверен, в какой версии это доступно, но вы можете просто добавить параметр для 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);
    }
}
person burhanloey    schedule 08.12.2018