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。

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

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

<!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 模板代码片段就能完成这项任务:

<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 属性所实现的功能是相同的:

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

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

Last updated