2015-02-05 62 views
3

有谁知道freemarker标签来检查freemarker文件中的spring安全角色和用户名吗?
检查Freemarker模板中的Spring安全角色和登录用户名

我从网络上的资源中发现以下代码会打印登录用户名。但它不是打印的用户名,取而代之的则是刚刚打印“登录为”

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

而且检查Freemarker的文件中的角色,也没有工作。有没有人做过?

回答

9

下面应该工作:
第1步:包括春季安全标签库中的freemarker文件的顶部
<#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> 

希望这有助于。

1

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

  1. 使用以下分配:根据您的Web根<#assign security=JspTaglibs[ "/WEB-INF/security.tld" ]><#assign security=JspTaglibs[ "/security.tld" ]>
  2. 非常难看:将security.tld从spring-security-taglibs jar复制到WEB-INF中。不幸的是,我无法让Freemarker从类路径中解析标签库。
0

您可以创建一个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>