在本教程中,我们将了解Spring Security Taglibs,它为访问安全信息和在 JSP 中应用安全约束提供基本支持。
首先,让我们将spring-security-taglibs 依赖添加到我们的pom.xml中:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
现在,在我们可以使用标签之前,我们需要在 JSP 文件的顶部导入标签库:
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
添加后,我们将能够使用 sec 前缀指定 Spring Security 的标签。
在我们的应用程序中,我们可能拥有只应为某些角色或用户显示的信息。
在这种情况下,我们可以使用 授权标签:
<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 表达式 作为我们的 访问值:
除此之外,我们可以检查被授权向特定 URL 发送请求的用户:
<sec:authorize url="/userManagement">
<a href="/userManagement">Manage Users</a>
</sec:authorize>
在某些情况下,我们可能希望对 UI 进行更多控制,例如在测试场景中。我们可以在application.properties文件中设置spring.security.disableUISecurity = true , 而不是让 Spring Security 跳过渲染这些未经授权的部分 。
当我们这样做时,授权标签不会隐藏它的内容。相反,它将使用<span class=”securityHiddenUI”>... </span>标签来包装内容。然后,我们可以使用一些 CSS 自定义渲染。
请记住,尽管通过 CSS 隐藏内容并不安全! 用户可以简单地查看源以查看未经授权的内容。
在其他时候,我们会想要显示登录用户的详细信息,比如说“欢迎回来,卡罗尔!” 在网站上。
为此,我们使用身份验证 标签:
<sec:authorize access="isAuthenticated()">
Welcome Back, <sec:authentication property="name"/>
</sec:authorize>
希望我们在我们的应用程序中启用了 Spring Security 的 CSRF 防御!
如果我们这样做了,那么 Spring Security 已经为我们在<form:form>标签内插入了一个 CSRF 隐藏表单输入 。
但是如果我们想使用<form>代替,我们可以使用csrfInput手动指示 Spring Security 应该将这个隐藏的输入字段放置在哪里:
<form method="post" action="/do/something">
<sec:csrfInput />
Text Field:<br />
<input type="text" name="textField" />
</form>
如果未启用 CSRF 保护,则此标签不输出任何内容。
或者,如果我们想在 Javascript 中访问 CSRF 令牌,我们可能希望将令牌作为元标记插入。
我们可以使用csrfMetaTags 标签来做到这一点:
<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 保护,此标签将不会输出任何内容。
在这篇快速文章中,我们重点介绍了一些常见的 Spring Security taglib 用例。
而且,正如我们所了解的,它们对于呈现身份验证和授权感知 JSP 内容非常有用。
一如既往,所有示例都可以在 Github 上找到。