2015-02-05 75 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>