一、Thymeleaf-Security
- Spring Security 可以在一些视图技术中进行控制显示效果,如JSP 或 Thymeleaf
- 在非前后端分离且使用 Spring Boot 的项目中大多使用 Thymeleaf 作为视图展示技术
- Thymeleaf 对 Spring Security 的支持都放在hymeleaf-extras-springsecurityX中,目前最新版本为 5。所以需要在项目中添加此 jar 包的依赖和 thymeleaf 的依赖
1 | xml复制代码<!-- thymeleaf依赖 --> |
- 在 html 页面中引入thymeleaf命名空间和security命名空间,引用命名空间之后才能使用对应属性信息
1 | html复制代码<!DOCTYPE html> |
- 配置文件中配置thymeleaf相关属性,默认属性参考类
- org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties
1 | yaml复制代码spring: |
二、Thymeleaf获取属性
2.1 获取属性
- 可以在html页面中通过 sec:authentication=”” 获取 UsernamePasswordAuthenticationToken 中以及父类中的属性
- org.springframework.security.authentication.UsernamePasswordAuthenticationToken
2. 源码属性如下
- name :登录账号名称
- principal:登录主体,在自定义登录逻辑中是 UserDetails
- credentials:凭证信息
- authorities:权限和角色
- details:WebAuthenticationDetails实例,可以获取 remoteAddress (客户端ip)和 sessionId (当前 sessionId)
3. 在 /templates/ 新建 security.html 用于显示上述所述属性信息
1 | html复制代码<!DOCTYPE html> |
- 在控制器中添加转发路径,必须要通过转化,直接访问无法获取属性
1 | java复制代码@RequestMapping("/security") |
- 正常访问项目,可以显示如下权限信息
1 | ruby复制代码登录账号:admin |
2.2 权限判断
- 可以在html页面中通过 sec:authorize=”” 进行鉴权,用来控制是否对应用户具备对应菜单
- 在security.html中增加权限相关信息
1 | html复制代码<!DOCTYPE html> |
- 和 access() 中表达式使用一致,分别使用admin和root用户登录,可以看到菜单部分对于没有权限的菜单并不会显示
4. 对于非前后分离的项目来说,菜单权限控制比较简单;对于前后分离的菜单不能直接使用到thymeleaf中对于security的支持,需要自定处理权限管理
三、thymeleaf解决csrf
- 在 /templates/ 中新增 login.html,添加隐藏域name值为 _csrf
1 | html复制代码<!DOCTYPE html> |
- 添加在controller中添加转化请求
1 | java复制代码@RequestMapping("/csrfLogin") |
- 在登录控制中需要放行 /csrfLogin 路径的访问
1 | java复制代码http.authorizeRequests() |
- 安全配置类中注释掉csrf相关代码
1 | java复制代码// 关闭csrf保护 |
- 使用csrfLogin访问登录页面,正常输入账号和密码之后系统正常登录
本文转载自: 掘金