Spring Security标签库在Spring Boot+PrimeFaces(无JoinFaces)环境下失效的配置咨询
解决Spring Boot+PrimeFaces(无JoinFaces)下Spring Security标签库不生效的问题
我之前在类似的技术栈组合里也碰到过这个问题——JoinFaces会自动帮我们完成Spring Security标签库的ServletContext注册,不用它的话就得手动配置,下面是亲测有效的步骤:
1. 确认依赖已正确引入
首先确保你的项目里已经添加了Spring Security标签库的依赖,Maven的话在pom.xml里加上:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> </dependency>
Gradle则是:
implementation 'org.springframework.security:spring-security-taglibs'
2. 手动注册Spring Security Facelets标签库
因为没有JoinFaces自动注册,我们需要通过代码把标签库绑定到ServletContext。你可以创建一个ServletContext初始化器:
import org.springframework.stereotype.Component; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletContextInitializer; @Component public class SecurityTagLibConfig implements ServletContextInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { // 直接引用Spring Security依赖中自带的标签库文件 String tagLibPath = "classpath:/META-INF/spring-security.taglib.xml"; // 将标签库添加到Facelets的库列表中 servletContext.setAttribute("javax.faces.FACELETS_LIBRARIES", tagLibPath); } }
或者另一种方式,通过注册标签处理器类来实现:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.taglibs.facelets.SpringSecurityFaceletsTagHandler; import javax.faces.application.Application; import javax.faces.application.ApplicationWrapper; @Configuration public class JsfSecurityConfig { @Bean public ApplicationWrapper securityTagHandlerApplicationWrapper(Application application) { return new ApplicationWrapper(application) { @Override public void addELResolver(javax.el.ELResolver resolver) { super.addELResolver(resolver); // 注册Spring Security的Facelets标签处理器 SpringSecurityFaceletsTagHandler.register(getWrapped()); } }; } }
3. 验证页面命名空间
确保你的JSF页面里的命名空间声明没有拼写错误:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:sec="http://www.springframework.org/security/tags">
4. 测试标签功能
比如在页面中使用<sec:authorize>或<sec:authentication>标签测试:
<h:panelGroup rendered="#{sec:isAuthenticated()}"> 欢迎您,<sec:authentication property="name"/>! </h:panelGroup> <h:panelGroup rendered="#{sec:hasRole('ADMIN')}"> <h:outputLink value="/admin">管理后台</h:outputLink> </h:panelGroup>
完成这些配置后,重启应用,Spring Security的标签库应该就能正常生效了。本质上就是手动完成了JoinFaces自动帮我们做的标签库注册工作~
内容的提问来源于stack exchange,提问作者Pavol Prusakovič
相关产品推荐
相关产品推荐

