# security-study **Repository Path**: loubobooo/security-study ## Basic Information - **Project Name**: security-study - **Description**: 关于Secruity的学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 12 - **Created**: 2023-01-09 - **Last Updated**: 2023-01-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目说明 ## 一、分支说明: master主分支:是目前最新版本。 v1分支:是SpringSecurity集成Jwt方式 v2分支:是在v1的基础上做的进一步扩展,增添了验证码。 v3分支:基于v2,无侵入式添加了邮件验证码、手机验证码登录方式。 ## 二、项目环境说明 - jdk11 - SpringBoot:2.5.2 - Redis数据库 相关配置可删除,将验证码存到其他的地方,或者直接模拟即可。 - SpringSecurity5.0+ - JWT ## 三、项目结构说明 ```cmd ─src ├─main │ ├─java │ │ └─com │ │ └─crush │ │ └─security │ │ ├─auth ## security相关 │ │ │ ├─email_code │ │ │ ├─filter │ │ │ ├─handle │ │ │ ├─mobile_code │ │ │ ├─service │ │ │ └─utils │ │ ├─code ## 验证码相关 │ │ │ ├─controller │ │ │ ├─entity │ │ │ ├─service │ │ │ │ └─impl │ │ │ └─utils │ │ ├─commons ##redis config │ │ │ └─config │ │ ├─controller │ │ ├─entity │ │ ├─mapper │ │ └─service │ │ └─impl │ └─resources │ ├─mapper │ │ └─user │ ├─sql #sql文件 │ └─static #忘删除了。没有postman测试的工具,可自己写页面,也可以用cmd命令行进行测试 ``` ## 四、项目启动说明 1. 导入sql文件。 2. 启动redis数据库 ----没有的好兄弟,可以去下载一个。 3. 修改配置文件中数据库相关连接 4. 启动项目 5. 开始测试 ## 五、测试 ### 5.1、测试账号密码验证码登录 1、启动项目后,先访问`http://localhost:8080/verifyImage/` 获取验证码。 ![image-20210918210842934](https://gitee.com/crushlxb/typora/raw/master/img/image-20210918210842934.png) 我在后端做的处理就是返回一段base64编码,[base64编码转换为图片](http://tool.chinaz.com/tools/imgtobase),前端直接用img标签就能展示。 `uuid`的设计,`uuid`就是`redis`中存储的`key`,如果在一个时段中,有很多人登录,就可以做到一一对应。 ![image-20210918211308289](https://gitee.com/crushlxb/typora/raw/master/img/image-20210918211308289.png) **登录**:`http://localhost:8080/login` 携带的data:格式为JSON ``` { "username":"user", "password":"user", "uuid":"b674ed1f9d8f4370826a9ade07f0595c",//验证码请求中的uuid "verifyCode":"50835" // 验证码 } ``` ![image-20210918211402330](https://gitee.com/crushlxb/typora/raw/master/img/image-20210918211402330.png) 返回数据: ```java { "id": 2, "username": "user", "password": null, "fullname": "青冬栗", "mobile": "17670930114", "email": "1185232242@qq.com", "uuid": null, "verifyCode": null, "enabled": 1, "locked": 0, "listAuthorities": [ "sys:add", "ROLE_USER", "sys:delete:", "sys:select" ], "token": "Bearer eyJhbGciOiJIUzUxMiJ9.eyJSb2xlIjpbInN5czphZGQiLCJST0xFX1VTRVIiLCJzeXM6ZGVsZXRlOiIsInN5czpzZWxlY3QiXSwic3ViIjoidXNlciIsImlzcyI6ImVjaGlzYW4iLCJleHAiOjE2MzE5NzQ0MTgsImlhdCI6MTYzMTk3MDgxOH0.fM5NZIAgKU6sWNvfkjrPQKEXXKiKWXfYCUzsjAHsUwe96tdOVYQLPBfQ3WcN0ktTtIYPCF30mMjQNnTtr0riAw", "e_code": null, "authorities": [ { "authority": "sys:add" }, { "authority": "ROLE_USER" }, { "authority": "sys:delete:" }, { "authority": "sys:select" } ], "accountNonLocked": true, "credentialsNonExpired": true, "accountNonExpired": true } ``` 这个权限一般不展示的,我这里是当时打印出来看的。😂 我们来进行测试,在`UserController`中都有。 ![image-20210918211652872](https://gitee.com/crushlxb/typora/raw/master/img/image-20210918211652872.png) 这里把我们在登录中获取到的token 填进 Bearer Token 这一栏,这个可以改的。我懒啦。 对下面的接口,大家可以一一进行测试。 ```java hasRole//是表示当前用户是否拥有这个角色 hasAuthority// 是表示当前用户是否拥有这个权限 ``` ![image-20210918211839861](https://gitee.com/crushlxb/typora/raw/master/img/image-20210918211839861.png) 有疑惑都可以来问我。 ### 5.2、测试邮件验证码登录 `http://localhost:8080/email/login?email=951930136@qq.com&e_code=123456` 这里的验证码是我直接写死了,实际应该存储到redis数据库中。 ![image-20210918212252890](https://gitee.com/crushlxb/typora/raw/master/img/image-20210918212252890.png) 返回数据: ```java { "id": 1, "username": "admin", "password": null, "fullname": "宁在春", "mobile": "123456", //我这里改了哈 "email": "951930136@qq.com", "uuid": null, "verifyCode": null, "enabled": 1, "locked": 0, "listAuthorities": [ "sys:update", "sys:add", "ROLE_ADMIN", "sys:delete:", "sys:select" ], "token": "Bearer eyJhbGciOiJIUzUxMiJ9.eyJSb2xlIjpbInN5czp1cGRhdGUiLCJzeXM6YWRkIiwiUk9MRV9BRE1JTiIsInN5czpkZWxldGU6Iiwic3lzOnNlbGVjdCJdLCJzdWIiOiJhZG1pbiIsImlzcyI6ImVjaGlzYW4iLCJleHAiOjE2MzE5NzQ5NTEsImlhdCI6MTYzMTk3MTM1MX0.2gU1Wttbo4z8Ad-OIIyCkU4tAChDjKCsm6eaBZCXtBBrLTZLXzQeM0fgsNnsTuBk5492Oz7RlwDaiBexOJHVbA", "e_code": null, "authorities": [ { "authority": "sys:update" }, { "authority": "sys:add" }, { "authority": "ROLE_ADMIN" }, { "authority": "sys:delete:" }, { "authority": "sys:select" } ], "accountNonLocked": true, "credentialsNonExpired": true, "accountNonExpired": true } ``` 我们请求的时候带上token访问即可。 ### 5.3、测试电话号码验证码登录 其本质是一样的。 `http://localhost:8080/mobile/login?mobile=17670930119&mobileCode=456789` ![image-20210918212649018](https://gitee.com/crushlxb/typora/raw/master/img/image-20210918212649018.png) 返回数据: ```json { "id": 1, "username": "admin", "password": null, "fullname": "宁在春", "mobile": "17670930115", "email": "951930136@qq.com", "uuid": null, "verifyCode": null, "enabled": 1, "locked": 0, "listAuthorities": [ "sys:update", "sys:add", "ROLE_ADMIN", "sys:delete:", "sys:select" ], "token": "Bearer eyJhbGciOiJIUzUxMiJ9.eyJSb2xlIjpbInN5czp1cGRhdGUiLCJzeXM6YWRkIiwiUk9MRV9BRE1JTiIsInN5czpkZWxldGU6Iiwic3lzOnNlbGVjdCJdLCJzdWIiOiJhZG1pbiIsImlzcyI6ImVjaGlzYW4iLCJleHAiOjE2MzE5NzUxODQsImlhdCI6MTYzMTk3MTU4NH0.BtNvqAIHk0UjGnnFj68-ONnjqfk0evVdaFQwMcdIg6MHGWc_-mSk7qq9-cCrFcN8KiixIwpYIS1sKM7n0oJkpw", "e_code": null, "authorities": [ { "authority": "sys:update" }, { "authority": "sys:add" }, { "authority": "ROLE_ADMIN" }, { "authority": "sys:delete:" }, { "authority": "sys:select" } ], "accountNonLocked": true, "credentialsNonExpired": true, "accountNonExpired": true } ``` 带上Token访问即可。 这个权限不应该展示的,这是个demo,我就懒的改了。(狗头保命!!) 😁 ## 六、相关博客 csdn博客链接:[主页](https://blog.csdn.net/weixin_45821811?spm=1000.2115.3001.5343) 1. [SpringBoot集成SpringSecurity做安全框架](https://blog.csdn.net/weixin_45821811/article/details/119618558?spm=1001.2014.3001.5501) 2. [Security的登录流程详解](https://blog.csdn.net/weixin_45821811/article/details/120475754?spm=1001.2014.3001.5501) 3. [SpringSecurity权限命名ROLE_问题](https://blog.csdn.net/weixin_45821811/article/details/119615126?spm=1001.2014.3001.5501) 4. [RBAC、控制权限设计、权限表设计 基于角色权限控制和基于资源权限控制的区别优劣](https://blog.csdn.net/weixin_45821811/article/details/115737401?spm=1001.2014.3001.5501) 掘金博客链接:[主页](https://juejin.cn/user/2859142558267559/posts) 1. [SpringBoot集成SpringSecurity做安全框架](https://juejin.cn/post/6995177894850854943) 2. [Security的登录流程详解](https://juejin.cn/post/7011827285854519332) 3. [Security实现多种登录方式、邮件验证码、手机验证码登录。](https://juejin.cn/post/7012180286322507790/) 4. [SpringSecurity权限命名ROLE_问题](https://juejin.cn/post/6995136682320199710) **你好,我是博主`宁在春`。** **要是jio得还不错,就点个关注吧,hxd** 👍 一起学习!!!