1. 概述
本文将带你快速了解 Spring Security Taglibs,这是一个用于在 JSP 页面中访问安全信息、控制页面元素显示的便捷工具。
它主要解决的问题是:如何根据不同用户角色或权限,动态展示页面内容。
2. Maven 依赖
要使用 Spring Security Taglibs,首先需要在 pom.xml
中添加如下依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>6.1.5</version>
</dependency>
✅ 注意:确保你的项目已经引入了 Spring Security 的核心模块。
3. 引入 Taglib
在使用标签前,需要在 JSP 页面顶部声明 Taglib:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
这样就可以使用 sec:
前缀来调用 Spring Security 提供的标签了。
4. authorize 标签详解
4.1. 使用 access 表达式控制显示
这个标签用于根据用户权限决定是否渲染某段内容。例如:
<sec:authorize access="!isAuthenticated()">
Login
</sec:authorize>
<sec:authorize access="isAuthenticated()">
Logout
</sec:authorize>
还可以检查用户是否拥有特定角色:
<sec:authorize access="hasRole('ADMIN')">
Manage Users
</sec:authorize>
常见的 Spring Security 表达式包括:
hasAnyRole('ADMIN','USER')
:当前用户拥有任意一个角色即可isAnonymous()
:当前用户是匿名用户isRememberMe()
:当前用户是“记住我”登录的isFullyAuthenticated()
:当前用户是完整认证登录(非匿名、非记住我)
⚠️ 踩坑提示:这些表达式和 Java 代码中的 @PreAuthorize
等注解用法一致,属于 SpEL 表达式范畴。
4.2. 通过 url 控制访问
也可以根据用户是否有权限访问某个 URL 来控制显示:
<sec:authorize url="/userManagement">
<a href="/userManagement">Manage Users</a>
</sec:authorize>
✅ 适用于菜单项、链接等场景,简单粗暴。
4.3. 调试模式:禁用 UI 安全隐藏
在开发或测试时,你可能希望看到被隐藏的内容,而不是让它们直接消失。
可以通过在 application.properties
中设置:
spring.security.disableUISecurity=true
此时,<sec:authorize>
不会隐藏内容,而是将其包裹在 <span class="securityHiddenUI">
标签中,方便调试样式。
⚠️ 注意:这只是前端显示控制,CSS 隐藏的内容用户依然可以通过查看源码看到,不安全!
5. authentication 标签:显示用户信息
用于显示当前认证用户的信息,比如用户名:
<sec:authorize access="isAuthenticated()">
Welcome Back, <sec:authentication property="name"/>
</sec:authorize>
✅ 实用性很高,比如显示“欢迎回来,张三”。
6. csrfInput 标签:手动插入 CSRF Token
如果你使用的是原生 <form>
而不是 Spring 的 <form:form>
,可以手动插入 CSRF 隐藏字段:
<form method="post" action="/do/something">
<sec:csrfInput />
Text Field:<br />
<input type="text" name="textField" />
</form>
✅ 如果 CSRF 未启用,该标签不会输出任何内容。
7. csrfMetaTags 标签:在 JS 中使用 CSRF Token
如果前端使用 JavaScript 发送请求,需要获取 CSRF Token,可以使用此标签插入 meta 标签:
<html>
<head>
<title>JavaScript with CSRF Protection</title>
<sec:csrfMetaTags />
<script type="text/javascript" language="javascript">
var csrfParameter = $("meta[name='_csrf_parameter']").attr("content");
var csrfHeader = $("meta[name='_csrf_header']").attr("content");
var csrfToken = $("meta[name='_csrf']").attr("content");
</script>
</head>
<body>
...
</body>
</html>
⚠️ 同样地,如果未启用 CSRF,此标签不会输出任何内容。
8. 总结
Spring Security Taglibs 提供了一组非常实用的 JSP 标签,能让你轻松实现:
- 权限控制内容显示
- 显示用户信息
- 插入 CSRF Token
非常适合快速构建权限敏感的 Web 页面。
所有示例代码可在 GitHub 获取:Spring Security 示例。