SpringBoot3与SpringSecurity6整合快速入门

笔记哥 / 04-15 / 43点赞 / 0评论 / 763阅读
### 一、环境说明 > > > 现在技术更新迭代真的很快,不少小伙伴还在抱怨,怎么又更新了,学不动了。晓凡也采用当前最新稳定版本的进行讲解,具体如下 > - `SpringBoot 3.2.0` - `SpringSecurity 6.2.0` - `JDK 17` - `MySQL 8.0` ### 二、SpringSecurity 简介 `SpringSecurity ` 是`Spring`大家族中一名重要成员,是专门负责安全的框架。 提到安全框架,做过Java开发的小伙伴可能还听说过`Shiro`。`Shiro`相对于`Spring Security`来说,更加简单。一般小型项目使用得比较多, 这里就不展开说了,感兴趣的小伙伴可以评论区留言,晓凡后面出教程。`Spring Security`一般用在中大型项目中。 **`Spring Security `能为项目做什么呢?** 我们来看看**官方文档:![](https://cdn.res.knowhub.vip/c/2504/16/d8b65303.html?GzoAAMSuOU783rbKxV3hoh0RBR2KtGKhqmsz1QvYKc1d3%2bOwJ4AsUCOPhig%2bVLV5Fw%3d%3d)**怎么说的? ![SpringSecurity官方介绍](https://cdn.res.knowhub.vip/c/2504/16/052ebb3c.png?G1YAAGQ9a5zoK1Xb6IbeJQ4JzYBEFkGlhPV6792nAXx%2fMLLmZ%2fax4nz4Sx8rgKVSEQFGLqhInpRJHU3Jk7lXJLKa9ww%3d) 翻译过来大概就是:`Spring Security` 是一个提供了**身份验证**、**授权**和**防止常见攻击**的功能的框架。 ### 三、常用名词解释 上面提到了**身份验证**、**授权**和**防止常见攻击** 三个专业名词。晓凡这里以小区中的保安系统来说明,大家肯定就秒懂了。 为了小区的安全,小区上了保安系统,确保只有合法的居民可以进入小区,并且他们只能访问自己的家,同时防止小偷和法外狂徒张三进来捣乱。 1. **身份认证(Authentication)**: - 就是确认你是谁的过程。`Spring Security` 会要求你提供一些信息,比如用户名和密码,然后它会检查这些信息是否正确。如果信息正确,就相当于给你发了一张小区的门禁卡,你就可以进入小区了。 2. **授权(Authorization)**: - 就是决定你可以做什么的过程。即使你进了小区,也不能随便去别人家。`Spring Security` 会检查你是否有权限去某个地方,比如你的家。你有权限,就可以进入;而隔壁老王,没有你家的权限,就会被拒之门外。 3. **防御常见攻击**: - 就像小区保安要防止小偷和张三一样,`Spring Security`也提供了很多功能来防止各种网络攻击: - **CSRF(跨站请求伪造)**:防止有人伪造你的请求,比如在你不知情的情况下,让你的账号发一些你不想要的帖子。 - **XSS(跨站脚本攻击)**:防止有人通过网页注入恶意脚本,偷取你的个人信息。 - **SQL注入**:防止有人通过输入特殊的命令,来操纵数据库,获取或破坏数据。 - **点击劫持**:防止有人通过一些手段,让你在不知情的情况下点击一些链接,从而执行一些你不想执行的操作。 ### 四、快速入门 说了一堆理论知识,下面晓凡带着大家敲代码,快速上手 #### 4.1 搭建一个Spring Boot Web项目 ① 创建`SecurityQuickStart`项目 ![创建项目](https://cdn.res.knowhub.vip/c/2504/16/072508c2.png?G1cAAMTsdJxI8gmq26hD2jvFHc2ARRpBpYT1es9Z%2byb6fgfD4jNan74%2f%2fKb16QS9JKkSGIkNIYhBrAKSShBRKznXqnENBw%3d%3d) ② 创建controller ```csharp @RestController public class HelloController { @GetMapping("/hello") public String hello(){ return "晓凡,你好!"; } } ``` ③ 启动项目,浏览器访问/hello接口 浏览器中访问:![](https://cdn.res.knowhub.vip/c/2504/16/43f25e42?Cw2AaHR0cDovL2xvY2FsaG9zdDo4MDgwL2hlbGxvAw%3d%3d) ![接口访问正常](https://cdn.res.knowhub.vip/c/2504/16/de5edeb7.png?G1YAAER17rxgWymCfice0wSBBJsBiSyCSgnr9fz%2f2pfI%2bzkUjPdoffr%2b8JfWpwtStZySQJGVCN4I46mFyKEUVh5qjGs4) #### 4.2 引入SpringSecurity ① 引入依赖 在`SpringBoot`项目中使用`SpringSecurity`,我们只需要引入如下依赖即可 ```csharp org.springframework.boot spring-boot-starter-security ``` ② 访问接口 依然在浏览器中输入:![](https://cdn.res.knowhub.vip/c/2504/16/a10d7c26?Cw2AaHR0cDovL2xvY2FsaG9zdDo4MDgwL2hlbGxvAw%3d%3d) 这时候,我们发现hello接口不能访问了,而是跳转到一个登录页面:![](https://cdn.res.knowhub.vip/c/2504/16/2d46f842?Cw2AaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xvZ2luAw%3d%3d) ![登陆页面](https://cdn.res.knowhub.vip/c/2504/16/c73b7068.png?G1cAAETn9LwUKBh03%2bkOtsSpiWsGLNIIKiWs1%2fP%2f%2b1xE7xdgWL5nHyvOh9%2f0sYKgVYoqgVHYkIIYxBq7Nk%2ficHAtVfKeAQ%3d%3d) 这时候我们需要输入用户名和密码才能访问接口 用户名默认为:user 密码会在控制台中打印出来 ![打印密码](https://cdn.res.knowhub.vip/c/2504/16/f747c6f4.png?G1cAAGQ9PS%2faVov6Tju6JYaEZsAijaBSwnq99%2b7TAL7fGVniM%2ftYfj78po%2flwKmSpgSMrCgIgYRJDItkC4RaslVFi3s6) **注意**:如果你没使用魔法上网,可能登录页面会如下图所示一样 ![丢失样式](https://cdn.res.knowhub.vip/c/2504/16/b4e95767.png?G1YAAETn9LwUKBjZvtMdbIlTE20GJLIIKiWs13vO2jfR9wcYlp%2fR%2boz94S%2btzyCoS1ElMAobkheD2MXVgCTqJu7V8hoB) 遇到这样的,小伙伴也不用慌,这是由于访问不了`bootstrap.min.css`样式造成的,并不影响正常业务流程 ![bootstrap.min.css反问不了](https://cdn.res.knowhub.vip/c/2504/16/9d86289b.png?G1cAAMTydJz4%2f%2fsT1W3UQZsoEpoBizSCSgnr9Z6z9i3y%2fQ0KxmfUPtv%2b8JvaZxP4ZcldoEhKhGCEsWhm9mCqVgwg4xoN) 点击"Sign in"进行登录,就可以正常访问接口了 ![正常访问接口](https://cdn.res.knowhub.vip/c/2504/16/2b1d74f0.png?G1cAAMTW3Dgp8EBl22gDdWfqnTYDFmkElRLW6917rpvo%2bwMMy0%2bvbcT68JvaRhD0ElclMJwNKYhBrPBpdiSwexE1kTx7AA%3d%3d) #### 4.3 配置默认用户/密码 默认情况下`SpringSecurity` 会为我们默认生成一个user用户,密码采用uuid随机生成(通过下图中`SecurityProperties`类的静态内部类user生成)。 ![初始化用户名和密码](https://cdn.res.knowhub.vip/c/2504/16/fea5912d.png?G1cAAER17rxgazei%2bJ14TBMEEmwGLNIIKiWs1%2fP%2fa18i7xdUer5H6zP2h9%2b0PkNoJ4qZUFnUkQKc8KqHF08wV1QDkdcI) 我们还可以通过`application.yml`配置文件来配置用户名和密码 ```csharp spring: security: user: password: 123456 name: admin ``` 通过上面配置之后,控制台将不再输出随机生成的密码,我们也可以通过admin/123456 登录 #### 4.4 注销 既然能登陆,那必然也是可以注销的。 我们只需浏览器输入:![](https://cdn.res.knowhub.vip/c/2504/16/cd1d2d9b?iw2AaHR0cDovL2xvY2FsaG9zdDo4MDgwL2xvZ291dAM%3d) 然后点击Log Out 即可注销 ![注销](https://cdn.res.knowhub.vip/c/2504/16/886e3f71.png?G1cAAMTsdJxI8omi26hD2jvFHc2ARRpBpYT1es9Z%2byb6fgfD4jNan74%2f%2fKb16QQtklQJjMSGEMQgVjlbRhBGZa3lKnENBw%3d%3d) ### 五、SpringSecurity 默认做了什么? 到这儿,我们算是正是入门了。其实我们出了引入依赖,其他啥也没干。那么`SpringSecurity`默认为我们做了些什么? ① 保护我们创建的/hello接口,不是随便一个老王就能来访问,要求对应用程序的任何交互进行身份验证; ② 程序启动时生成一个默认用户“user”; ③ 生成一个默认的随机密码,并将此密码记录在控制台上; ④ 生成默认的登录表单和注销页面,并提供登录和注销功能; ⑤ 对于请求,重定向到登录页面