# 9.5.2　使用 Thymeleaf 的 Spring Security 方言

与 Spring Security 的 JSP 标签库类似，Thymeleaf 的安全方言提供了条件化渲染和显示认证细节的能力。表 9.8 列出了安全方言所提供的属性。

| 属性                 | 作用                                                                                      |
| ------------------ | --------------------------------------------------------------------------------------- |
| sec:authentication | 渲染认证对象的属性。类似于Spring Security 的 \<sec:authentication/> JSP 标签                            |
| sec:authorize      | 基于表达式的计算结果，条件性的渲染内容。类似于 Spring Security 的 \<sec:authorize> JSP 标签                       |
| sec:authorize-acl  | 基于表达式的计算结果，条件性的渲染内容。类似于 Spring Security 的 \<sec:accesscontrollist/> JSP标签               |
| sec:authorize-expr | sec:authorize 属性的别名                                                                     |
| sec:authorize-url  | 基于给定 URL 路径相关的安全规则，条件性的渲染内容。类 似于 Spring Security 的 \<sec:authorize> JSP 标签使用 url 属性时的场景 |

为了使用安全方言，我们需要确保 Thymeleaf Extras Spring Security 已经位于应用的类路径下。然后，还需要在配置中使用 SpringTemplateEngine 来注册SpringSecurityDialect。程序清单 9.10 所展现的 @Bean 方法声明了 SpringTemplateEngine bean，其中就包含了 SpringSecurityDialect。

```java
@Bean
public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) {
  SpringTemplateEngine templateEngine = new SpringTemplateEngine();
  templateEngine.setTemplateResolver(templateResolver);
  templateEngine.addDialect(new SpringSecurityDialect());
  return templateEngine;
}
```

安全方言注册完成之后，我们就可以在 Thymeleaf 模板中使用它的属性了。首先，需要在使用这些属性的模板中声明安全命名空间：

```markup
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
...
</html>
```

在这里，标准的 Thymeleaf 方法依旧与之前一样，使用 th 前缀，安全方言则设置为使用 sec 前缀。

这样我们就能在任意合适的地方使用 Thymeleaf 属性了。比如，假设我们想要为认证用户渲染 “Hello” 文本。如下的 Thymeleaf 模板代码片段就能完成这项任务：

```markup
<div sec:authorize="isAuthenticated">
  Hello <span sec:authentication="name">someone</span>
</div>
```

sec:authorize 属性会接受一个 SpEL 表达式。如果表达式的计算结果为 true，那么元素的主体内容就会渲染。在本例中，表达式为 isAuthenticated()，所以只有用户已经进行了认证，才会渲染标签的主体内容。就这个标签的主体内容部分而言，它的功能是使用认证对象的 name 属性提示 “Hello” 文本。

你可能还记得，在 Spring Security 中，借助 `<sec:authorize>` JSP 标签的 url 属性能够基于给定 URL 的权限有条件地渲染内容。在 Thymeleaf 中，我们可以通过 sec:authorize-url 属性完成相同的功能。例如，如下 Thymeleaf 代码片段所实现的功能与之前 `<sec:authorize>` JSP 标签和 url 属性所实现的功能是相同的：

```markup
<span sec:authorize-url="/admin">
  <br/>
  <a th:href="@{/admin}">Admin</>
</span>
```

如果用户有权限访问 “/admin” 的话，那么到管理页面的链接就会渲染，否则的话，这个链接将不会渲染。
