使用thymeleaf渲染前端的html时,thymeleaf为SpringSecurity提供的标签属性,首先需要引入thymeleaf-extras-springsecurity4依赖支持。
一、在pom 文件中的引入springsecurity的标签依赖thymeleaf-extras-springsecurity5。
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
二、在html文件里面申明使用。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5" >
三、常用SpringSecurity的标签属性介绍
//判断用户是否已经登陆认证,引号内的参数必须是isAuthenticated()。
sec:authorize="isAuthenticated()"
//获得当前用户的用户名,引号内的参数必须是name。
sec:authentication=“name”
//判断当前用户是否拥有指定的权限。引号内的参数为权限的名称。
sec:authorize=“hasRole(‘role’)”
//获得当前用户的全部角色,引号内的参数必须是principal.authorities。
sec:authentication="principal.authorities"
四、运用介绍
使用sec:authorize="isAuthenticated()" 判断是否登录 登录之后显示的页面内容
<div sec:authorize="isAuthenticated()">
<h2><span sec:authentication="name"></span>,您好 您的身份是
<span sec:authentication="principal.authorities"></span>
</h2>
</div>
使用sec:authorize="hasRole('VIP1')"控制
<div sec:authorize="hasRole('VIP1')">
<h3>我的VIP角色</h3>
<ul>
<li><a th:href="@{/level1/1}">免费阅读</a></li>
<li><a th:href="@{/level1/2}">购买8折</a></li>
</ul>
</div>
我相信很多小伙伴在初次接触 Spring Security 时,一定会被这个问题所困扰,例如如下两段配置:
http.authorizeRequests()
.antMatchers("/admin/**").hasAuthority("admin")
.antMatchers("/user/**").hasAuthority("user")
.anyRequest().authenticated()
以及
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("admin")
.antMatchers("/user/**").hasRole("user")
.anyRequest().authenticated()
hasRole 和 hasAuthority 有什么区别呢?
hasRole 的处理逻辑和 hasAuthority 似乎一模一样,不同的是,hasRole 这里会自动给传入的字符串加上 ROLE_
前缀,所以在数据库中的权限字符串需要加上 ROLE_
前缀。即数据库中存储的用户角色如果是 ROLE_admin
,这里就是 admin。
我们在调用 hasAuthority
方法时,如果数据是从数据库中查询出来的,这里的权限和数据库中保存一致即可,可以不加 ROLE_
前缀。即数据库中存储的用户角色如果是 admin,这里就是 admin。
也就是说,使用 hasAuthority
更具有一致性,你不用考虑要不要加 ROLE_
前缀,数据库什么样这里就是什么样!而 hasRole
则不同,代码里如果写的是 admin
,框架会自动加上 ROLE_
前缀,所以数据库就必须是 ROLE_admin
。
hasAnyRole 在调用 hasAnyAuthorityName 方法时设置了 ROLE_
前缀,hasAnyAuthority 在调用 hasAnyAuthorityName 方法时没有设置前缀