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。
1
@Bean
2
public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) {
3
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
4
templateEngine.setTemplateResolver(templateResolver);
5
templateEngine.addDialect(new SpringSecurityDialect());
6
return templateEngine;
7
}
Copied!
安全方言注册完成之后,我们就可以在 Thymeleaf 模板中使用它的属性了。首先,需要在使用这些属性的模板中声明安全命名空间:
1
<!DOCTYPE html>
2
<html xmlns="http://www.w3.org/1999/xhtml"
3
xmlns:th="http://www.thymeleaf.org"
4
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
5
...
6
</html>
Copied!
在这里,标准的 Thymeleaf 方法依旧与之前一样,使用 th 前缀,安全方言则设置为使用 sec 前缀。
这样我们就能在任意合适的地方使用 Thymeleaf 属性了。比如,假设我们想要为认证用户渲染 “Hello” 文本。如下的 Thymeleaf 模板代码片段就能完成这项任务:
1
<div sec:authorize="isAuthenticated">
2
Hello <span sec:authentication="name">someone</span>
3
</div>
Copied!
sec:authorize 属性会接受一个 SpEL 表达式。如果表达式的计算结果为 true,那么元素的主体内容就会渲染。在本例中,表达式为 isAuthenticated(),所以只有用户已经进行了认证,才会渲染标签的主体内容。就这个标签的主体内容部分而言,它的功能是使用认证对象的 name 属性提示 “Hello” 文本。
你可能还记得,在 Spring Security 中,借助 <sec:authorize> JSP 标签的 url 属性能够基于给定 URL 的权限有条件地渲染内容。在 Thymeleaf 中,我们可以通过 sec:authorize-url 属性完成相同的功能。例如,如下 Thymeleaf 代码片段所实现的功能与之前 <sec:authorize> JSP 标签和 url 属性所实现的功能是相同的:
1
<span sec:authorize-url="/admin">
2
<br/>
3
<a th:href="@{/admin}">Admin</>
4
</span>
Copied!
如果用户有权限访问 “/admin” 的话,那么到管理页面的链接就会渲染,否则的话,这个链接将不会渲染。
Last modified 2yr ago
Copy link