在Freemarker模板中检查Spring安全角色和已记录的用户名

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Freemarker模板中检查Spring安全角色和已记录的用户名相关的知识,希望对你有一定的参考价值。

有没有人知道freemarker标签来检查freemarker文件中的spring安全角色和用户名?

我从网上的几个资源中发现以下代码将打印登录的用户名。但它不是打印用户名,而是打印“登录为”

<security:authorize access="isAuthenticated()">
    logged in as <security:authentication property="principal.username" /> 
</security:authorize>

检查Freemarker文件中的角色也不起作用。有没有人以前做过?

答案

以下应该有效: 步骤1:在freemarker文件的顶部包含Spring安全标记库 <#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />

第2步:检查角色名称

<@security.authorize ifAnyGranted="ROLE_USER">
    Your role is "ROLE_USER" <br/>
</@security.authorize>

第3步:检查登录用户的登录名

<@security.authorize access="isAuthenticated()">
    logged in as <@security.authentication property="principal.username" /> 
</@security.authorize>

<@security.authorize access="! isAuthenticated()">
    Not logged in
</@security.authorize>

希望这可以帮助。

另一答案

我正在使用Maven / Jetty设置,Spring Security Tags不会自动放入WEB-INF / lib。因此,需要进行以下调整:

  1. 使用以下分配:<#assign security=JspTaglibs[ "/WEB-INF/security.tld" ]><#assign security=JspTaglibs[ "/security.tld" ]>,具体取决于您的Web根目录。
  2. 非常难看:将security.tld从spring-security-taglibs jar复制到WEB-INF中。不幸的是,我无法让Freemarker从类路径中解析标记lib。
另一答案

您可以创建一个可以在上下文中注入用户的HandlerInterceptor

public class PutUserInModelInterceptor implements HandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest aRequest, HttpServletResponse aResponse, Object aHandler) throws Exception {
    return true;
  }

  @Override
  public void postHandle(HttpServletRequest aRequest, HttpServletResponse aResponse, Object aHandler, ModelAndView aModelAndView) throws Exception {
    if(aModelAndView != null) {
      Principal user = aRequest.getUserPrincipal();
      aModelAndView.addObject("__user", user);
    }
  }

  @Override
  public void afterCompletion(HttpServletRequest aRequest, HttpServletResponse aResponse, Object aHandler, Exception aEx) throws Exception { }

}

然后注册:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new PutUserInModelInterceptor());
  }

}

然后在模板中使用它。例如:

<#if !(__user??)> 
  <a class="p-2" href="#" data-toggle="modal" data-target="#signinModal">Sign in</a>
<#else>
  <span class="badge badge-secondary">${__user.getName()}</span>
</#if>

以上是关于在Freemarker模板中检查Spring安全角色和已记录的用户名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Freemarker 模板中访问 Spring 应用程序属性?

如何在 Freemarker 模板中访问 Spring 应用程序属性?

在 Spring 应用程序中从 FreeMarker 获取模板文本

在 Freemarker 模板中显示 Spring MVC 验证错误

如何在spring中的freemarker模板中获取请求上下文

如何在 Spring Boot 应用程序中使用 Freemarker 模板发送电子邮件?