OAuth 2.0(SSO 单点登录)
OAuth 2.0 是什么?OAuth 2.0 的概念讲解,可以阅读如下三篇文章:
《理解 OAuth 2.0》(opens new window)
《OAuth 2.0 的一个简单解释》(opens new window)
《OAuth 2.0 的四种方式》(opens new window)
重点是理解 授权码模式 和 密码模式,它们是最常用的两种授权模式。
本文,我们也会基于它们,分别实现 SSO 单点登录。
#OAuth 2.0 授权模式的选择?授权模式的选择,其实非常简单,总结起来就是一张图:
问题一:什么场景下,使用客户端模式(Client Credentials)?
如果令牌拥有者是机器的情况下,那就使用客户端模式。 例如说:
开发了一个开放平台,提供给其它外部服务调用
开发了一个 RPC 服务,提供给其它内部服务调用
实际的案例,我们接入微信公众号时,会使用 appid 和 secret 参数,获取 Access token (opens new window)访问令牌。
问题二:什么场景下,使用密码模式(Resource Owner Password Cre ...
三方登录
系统对接国内多个第三方平台,实现三方登录的功能。例如说:
管理后台:企业微信、阿里钉钉
用户 App:微信公众号、微信小程序
友情提示:为了表述方便,本文主要使用管理后台的三方登录作为示例。
用户 App 也是支持该功能,你可以自己去体验一下。
#1. 表结构
① 三方登录完成时,系统会将三方用户存储到 system_social_user (opens new window)表中,通过 type (opens new window)标记对应的第三方平台。
② 【未】关联本系统 User 的三方用户,需要在三方登录完成后,使用账号密码进行「绑定登录」,成功后记录到 system_social_user_bind (opens new window)表中。
【已】关联本系统 User 的三方用户,在三方登录完成后,直接进入系统,即「快捷登录」。
#2. 绑定登录① 使用浏览器访问 http://127.0.0.1:1024/login (opens new window)地址,点击 [钉钉] 或者 [企业微信] 进行三方登录。此时,会调用 /admin-api/system/aut ...
用户体系
系统提供了 2 种类型的用户,分别满足对应的管理后台、用户 App 场景。
AdminUser 管理员用户,前端访问 yudao-ui-admin-vue3 (opens new window)管理后台,后端访问 /admin-api/** RESTful API 接口。
MemberUser 会员用户,前端访问 yudao-ui-user (opens new window)用户 App,后端访问 /app-api/** RESTful API 接口。
虽然是不同类型的用户,他们访问 RESTful API 接口时,都通过 Token 认证机制,具体可见 《开发指南 —— 功能权限》。
#1. 表结构2 种类型的时候,采用不同数据库的表进行存储,管理员用户对应 system_users (opens new window)表,会员用户对应 member_user (opens new window)表。如下图所示:
为什么不使用统一的用户表?
确实可以采用这样的方案,新增 type 字段区分用户类型。不同用户类型的信息字段,例如说上图的 dept_id、post_ids 等等 ...
数据权限
数据权限,实现指定用户可以操作指定范围的数据。例如说,针对员工信息的数据权限:
用户
数据范围
普通员工
自己
部门领导
所属部门的所有员工
HR 小姐姐
整个公司的所有员工
上述的这个示例,使用硬编码是可以实现的,并且也非常简单。但是,在业务快速迭代的过程中,类似这种数据需求会越来越多,如果全部采用硬编码的方式,无疑会给我们带来非常大的开发与维护成本。
因此,项目提供 yudao-spring-boot-starter-biz-data-permission (opens new window)技术组件,只需要少量的编码,无需入侵到业务代码,即可实现数据权限。
友情提示:数据权限是否支持指定用户只能查看数据的某些字段?
不支持。权限可以分成三类:功能权限、数据权限、字段权限。
字段权限的控制,不属于数据权限,而是属于字段权限,会在未来提供,敬请期待。
#1. 实现原理yudao-spring-boot-starter-biz-data-permission 技术组件的实现原理非常简单,每次对数据库操作时,他会自动拼接 WHERE data_column = ? ...
功能权限
👍 相关视频教程
功能权限 01:如何设计一套权限系统?(opens new window)
功能权限 02:如何实现菜单的创建?(opens new window)
功能权限 03:如何实现角色的创建?(opens new window)
功能权限 04:如何给用户分配权限 —— 将菜单赋予角色?(opens new window)
功能权限 05:如何给用户分配权限 —— 将角色赋予用户?(opens new window)
功能权限 06:后端如何实现 URL 权限的校验?(opens new window)
功能权限 07:前端如何实现菜单的动态加载?(opens new window)
功能权限 08:前端如何实现按钮的权限校验?(opens new window)
#1. RBAC 权限模型系统采用 RBAC 权限模型,全称是 Role-Based Access Control 基于角色的访问控制。
简单来说,每个用户拥有若干角色,每个角色拥有若干个菜单,菜单中存在菜单权限、按钮权限。这样,就形成了 “用户<->角色<->菜单” 的授权模型。 ...
代码生成(树表)
友情提示:
本文接 《代码生成【单表】》,请务必先阅读。因为重复的内容,本文会不再赘述!
树表,是在“单表”的基础上,增加了「树形结构」的功能。
例如说:部门、分类等,是一个树形结构。我们可以通过树形结构,来展示部门、分类的层级关系。
下面,我们将演示“树表”的使用,基于代码生成器,在 yudao-module-system 模块中,开发一个【分类】的功能。
#1. 数据库表结构设计设计分类的数据库表名为 system_category,其建表语句如下:
123456789101112CREATE TABLE `system_category` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名字', `parent_id` bigint NOT NULL COMMENT ...
代码生成【主子表】
友情提示:
本文接 《代码生成【单表】》,请务必先阅读。因为重复的内容,本文会不再赘述!
主子表,指的是一个主表,被多个子表所关联,关联的关系是一对一或一对多。
例如说:主表是【学生】,子表可以是:
子表是【成绩】,两者是“一对多”的关系,一个学生可以有多个成绩。
子表是【班级】,两者是“一对一”的关系,一个学生只能有一个班级。
下面,我们将演示“主子表”的使用,基于代码生成器,在 yudao-module-system 模块中,开发一个【学生】的功能。
友情提示:
目前只有 yudao-ui-admin-vue3 支持主子表,yudao-ui-admin-vue2、yudao-ui-admin-vben 正在适配中!
#0. 主子表模式针对不同的交互模式,项目提供了三种主子表模式:标准、ERP、内嵌。
#0.1 标准模式对应 [基础设施 -> 代码生成案例 -> 主子表(标准)] 菜单。
在新增和修改时,主表和子表在一个弹窗表单中,一起提交。如下图所示:
#0.2 内嵌模式对应 [基础设施 -> 代码生成案例 -> 主子表(内嵌)] 菜单。
在「标准模式 ...
代码生成【单表】(新增功能)
大部分项目里,其实有很多代码是重复的,几乎每个模块都有 CRUD 增删改查的功能,而这些功能的实现代码往往是大同小异的。如果这些功能都要自己去手写,非常无聊枯燥,浪费时间且效率很低,还可能会写错。
所以这种重复性的代码,项目提供了 codegen (opens new window)代码生成器,只需要在数据库中设计好表结构,就可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验。
针对不同的业务场景,项目提供了三种模式:单表、树表、主子表。
本文,我们将演示“单表”的使用,基于代码生成器,在 yudao-module-system 模块中,开发一个【用户组】的功能。
#👍 相关视频教程
从零开始 05:如何 5 分钟,开发一个新功能?(opens new window)
#1. 数据库表结构设计设计用户组的数据库表名为 system_group,其建表语句如下:
12345678910111213CREATE TABLE `system_group` ( `id` bigint NOT NULL AUTO_INCREMENT C ...
新建模块
本章节,将介绍如何新建名字为 yudao-module-demo 的示例模块,并添加 RESTful API 接口。
虽然内容看起来比较长,是因为艿艿写的比较详细,大量截图,保姆级教程!其实只有五个步骤,保持耐心,跟着艿艿一点点来。🙂 完成之后,你会对整个 项目结构 有更充分的了解。
#👍 相关视频教程
从零开始 06:如何 5 分钟,创建一个新模块?(opens new window)
#1. 新建 demo 模块① 选择 File -> New -> Module 菜单,如下图所示:
② 选择 Maven 类型,并点击 Next 按钮,如下图所示:
③ 选择父模块为 yudao,输入名字为 yudao-module-demo,并点击 Finish 按钮,如下图所示:
④ 打开 yudao-module-demo 模块,删除 src 文件,如下图所示:
⑤ 打开 yudao-module-demo 模块的 pom.xml 文件,修改内容如下:
提示
<!-- --> 部分,只是注释,不需要写到 XML 中。
1234567891011121314 ...
【统计】会员、商品、交易统计
本小节,我们来讲 [商城系统 -> 统计中心] 菜单下的会员、商品、交易统计相关内容,它们是由 yudao-module-statistics-biz 后端模块实现。
友情提示:为什么所有数据库操作都使用 StatisticsMapper 结尾呢?
一方面,和现有业务使用的 Mapper 独立开,避免业务 Mapper 混乱,统计 SQL 往往较为复杂(个性化)。
另一方面,随着数据规模的增大,统计 SQL 不适合放在 MySQL 关系数据库中执行,往往会引入 ClickHouse、Doris 作为数据仓库,这个时候只要把 StatisticsMapper 改造下即可。
另外,考虑统计 SQL 往往非常消耗 MySQL 资源,可以把 StatisticsMapper 切到单独的 MySQL 读库上,避免影响线上业务。
#1. 会员统计由 MemberStatisticsController 提供统计接口。
#1.1 表结构暂时没有统计表,都是通过 SQL 查询实现。
#1.2 管理后台对应 [商城系统 -> 统计中心 -> 会员统计] 菜单,对应 yudao-ui-a ...
