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 示例


原始标题:Introduction to Spring Security Taglibs

» 下一篇: Java Weekly, 第245期