在 Freemarker 模板中检查 Spring 安全角色和记录的用户名
Checking Spring security roles and logged username in Freemarker template
有谁知道在 freemarker 文件中检查 spring 安全角色和用户名的 freemarker 标签?
我从网络上的几个资源中发现以下代码将打印登录的用户名。但它不打印用户名,而是只打印 "logged in as"
<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 安全标签不会自动放入 WEB-INF/lib。因此需要进行以下调整:
- 使用以下分配:
<#assign security=JspTaglibs[ "/WEB-INF/security.tld" ]>
或 <#assign security=JspTaglibs[ "/security.tld" ]>
,具体取决于您的网络根目录。
- 非常丑陋:将 security.tld 从 spring-security-taglibs jar 复制到 WEB-INF 中。不幸的是,我无法让 Freemarker 从类路径中解析标签库。
您可以创建一个可以在上下文中注入用户的 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 标签?
我从网络上的几个资源中发现以下代码将打印登录的用户名。但它不打印用户名,而是只打印 "logged in as"
<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 安全标签不会自动放入 WEB-INF/lib。因此需要进行以下调整:
- 使用以下分配:
<#assign security=JspTaglibs[ "/WEB-INF/security.tld" ]>
或<#assign security=JspTaglibs[ "/security.tld" ]>
,具体取决于您的网络根目录。 - 非常丑陋:将 security.tld 从 spring-security-taglibs jar 复制到 WEB-INF 中。不幸的是,我无法让 Freemarker 从类路径中解析标签库。
您可以创建一个可以在上下文中注入用户的 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>