一、文章前言
- SpringBoot-Security系列篇主要讲解了SpringBoot整合SpringSecurity
- 主要包含权限控制、URL匹配、Thymeleaf整合,包含日常项目中使用的大多数场景
- 文章内容所有代码都可以正常执行,特殊说明本系列中使用到的PrintUtil和JsonUtil是自己封装的两个小工具,可以使用System.out.println和fastjson实现,功能一致
- 文档内容也参考了一些文档,有问题可以评论区留言,相互探讨,相互学习
- 本系列完整源码已经放网盘(有需要的可以自行下载上传到git仓库)
链接: pan.baidu.com/s/14JfxHNz7… 提取码: 87vq
- 源码说明,其中含有一个common-api依赖,里面是一个简单工具类封装,springboot-security为核心源码
二、Security框架集成
- 新建SpringBoot项目,添加spring-boot-starter-security依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath/>
</parent>
<groupId>com.codecoord</groupId>
<artifactId>springboot-security</artifactId>
<version>1.0</version>
<name>springboot-security</name>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- security安全框架核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
</project>
复制代码
- 在resources下新建static文件夹,用于存放静态资源文件,并在其中创建两个静态HTML文件,用户登录跳转
login.html:登录页面
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>系统登录</title>
</head>
<body>
<form action="/login" method="post">
用户名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
复制代码
main.html:登录成功后跳转页面
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>SpringBoot Security</title>
</head>
<body>
<h3>欢迎登录SpringBoot Security首页</h3>
</body>
</html>
复制代码
- 新建登录controller,处理登录请求
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
@RequestMapping("/login")
public String login() {
return "redirect:main.html";
}
}
复制代码
- 启动项目,访问login.html,发现此页面被拦截,被security的自带登录页面给替代
- 输入账号和密码,进行登录
- 账号:默认user
- org.springframework.boot.autoconfigure.security.SecurityProperties.User#name
- 密码在服务启动时在控制台有输出
- 账号:默认user
6. 登录之后可跳转login.html
三、Security密码配置
- 上述登录默认登录密码,且每次密码都需要从控制台查找当重启服务时默认密码将会更改
- 可以在配置文件中配置固定的账号和密码
- 只配置用户,密码使用控制台输出
- 只配置密码,用户名使用默认user
- 两个都配置,以配置为准
- 配置文件优先级大于默认
spring:
# 安全配置
security:
user:
# 配置用户名和密码
#name: tianxin
#password: tianxin
# 配置角色
roles: admin,normal
复制代码
- 上面配置文件中配置文件方式并不安全,存在密码泄露且无法排查风险
- 所以可以进行数据库验证配置,每次验证从数据库中进行验证,数据库验证参考后续文章
- 通过简单的引入依赖,就可以集成SpringSecurity
四、CSRF跨站请求伪造
- CSRF(Cross-site request forgery-跨站请求伪造):跨站请求伪造也被称为one-click attack或sessionriding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法
- 跨域:只要网络协议、ip 地址、端口中任何一个不相同就是跨域请求
- 客户端与服务进行交互时,由于 http 协议本身是无状态协议,所以引入了cookie进行记录客户端身份,在cookie中会存放session id用来识别客户端身份
- 在跨域的情况下,session id 可能被第三方恶意劫持,通过这个 session id 向服务端发起请求时,服务端会认为这个请求合法,可能发生很多意想不到的事情
- 从 Spring Security4开始CSRF防护默认开启,默认会拦截请求进行CSRF处理
- CSRF为了保证不是其他第三方网站访问,要求访问时携带参数名为_csrf值为token(token 在服务端产生)的内容,如果token和服务端的token匹配成功,则正常访问
- 如果登录控制里面没有关闭csrf保护,则登录请求会跳转到登录页面(如果有对应异常处理器则会跳转到异常处理器)处理
- CSRF可以整合thymeleaf进行实现,可以参考thymeleaf整合一节中csrf相关部分
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END