RuoYi-Cloud
1.项目介绍
RuoYi-Cloud 是一个 Java EE 分布式微服务架构平台,基于经典技术组合(Spring Boot、Spring Cloud & Alibaba、Vue、Element),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源。
架构图
2.快速使用
2.1.项目下载
https://gitee.com/y_project/RuoYi-Cloud
2.2.数据库运行sql代码,新建三个数据库——ry-cloud,ry-config,ry-seata
分别运行三个sql文件
ry-config运行ry_config_20250224.sql(这个数据库的作用就是在nacos启动后去ry-config中读取配置信息)
ry-seata运行ry_seata_20210128.sql
ry-cloud运行ry_20250425.sql
2.3.配置Nacos并启动
来到Nacos的解压目录下的conf下的application.properties文件中
将连接到外置本地数据库的代码去掉注释并修改为自己的数据库和用户名和密码
启动nacos
将nacos中配置管理中涉及到连接数据库的地方改成自己的
2.4启动后端服务
这里的地址要和nacos配置的地址保持一致
全部运行成功
2.5启动前端服务
npm install,安装项目依赖,然后
npm run dev,运行前端项目,默认端口应该是80端口
启动成功,如下页面
2.6添加新的模块
如果你在若依新加的模块【例如ruoyi-purchase】
你要在nacos中的ruoyi-gateway-dev.yml中进行配置路由,而且要在nacos配置文件中新加一个ruoyi-purchase-dev.yml【内容复制ruoyi-system-dev.yml进行相应的修改】
ruoyi-purchase的配置文件配置服务名
在nacos配置文件中新加一个ruoyi-purchase-dev.yml【内容复制ruoyi-system-dev.yml进行相应的修改】
2.7 新增demo
2.7.1 新建数据库表
五张表:
1.用户表:id,name,phone,email
2.角色表:id,name
3.用户角色中间表:用户id,角色id
4.菜单权限标识表:id, 菜单名称,菜单类型(目录,菜单,按钮),对应前端组件路径,对应后端接口权限标识
5.角色菜单中间表:角色id,菜单id
用户关联角色,角色关联权限,实现用户和权限相关联
CREATE TABLE user(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,phone VARCHAR(15),email VARCHAR(100) UNIQUE NOT NULL
);CREATE TABLE role(id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL UNIQUE
);CREATE TABLE user_role(userid INT NOT NULL,roleid INT NOT NULL,PRIMARY KEY (userid, roleid),FOREIGN KEY (userid) REFERENCES user(id) ON DELETE CASCADE,FOREIGN KEY (roleid) REFERENCES role(id) ON DELETE CASCADE
);CREATE TABLE menu (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,type ENUM('catalogue', 'caidan', 'button') NOT NULL,path VARCHAR(200),auth VARCHAR(100)
);CREATE TABLE role_menu (roleid INT NOT NULL,menuid INT NOT NULL,PRIMARY KEY (roleid, menuid),FOREIGN KEY (roleid) REFERENCES role(id) ON DELETE CASCADE,FOREIGN KEY (menuid) REFERENCES menu(id) ON DELETE CASCADE
);
2.7.2 代码生成
先导入刚才新建的表,生成对应的代码,然后下载代码
2.7.3 导入生成的代码
在数据库执行sql代码,后端导入main,前端导入vue
3.权限管理
3.1 基础框架
若依的权限管理架构基于用户-角色-权限的RBAC模型,并扩展了数据权限控制。核心架构可分为以下四层:
架构图设计
3.2 原理与用法
若依的权限管理分成两个部分:权限标识和数据权限。
3.2.1权限标识
首先先来讲用权限字符串实现的RBAC权限管理系统。想必用若依的肯定看到“content:article:list”这种形式的字符串放在控制器方法头上。这个就是权限字符串。用户拥有的权限字符串就相当于钥匙,要执行的方法就是要开的锁。你只有拥有钥匙才能开锁。
当我们新增一个用户时,新用户是没用任何权限的,我们要先赋予这个新用户角色。而角色就相当于钥匙串,如果你没往上面挂钥匙那么你就没有任何权限。
菜单管理界面列出了访问菜单所需要的权限标识(权限字符串),你登录的用户所拥有的角色如果没有这些权限就看不到这些菜单。
创建角色的时候有个树状列表让你选这些菜单,就是往钥匙串上挂钥匙的过程。这些菜单上有哪些权限标识,就会往这个角色上赋予哪些权限标识。
创建完角色,赋予了角色权限,然后再将角色赋予新创建的用户,这样授权就完成了。
鉴权逻辑是这样的:
- 用户登录的时候系统查询数据库,将用户拥有的所有权限以权限字符串的形式发给用户,也就是作为登录信息(session)存到redis里。
- 在用户进行需要权限的操作时,系统会取出redis中用户的登录信息,从中得到权限字符串,再将操作需要的权限字符串拿去和用户拥有的权限字符串进行比对,如果找不到需要的权限字符串,则判定为没有权限。找到了就鉴权成功。
- 管理员拥有的权限是“*:*:*”,就相当于一把万能钥匙,能开所有的锁,拥有任何操作的权限。
3.2.2数据权限
数据权限解决的是一个很常见的需求:一个博客网站,很多作者都能在网站上发布文章。博客的后台每个作者只能看到和操作自己的文章,看不到别人发布的。
若依解决这个需求的方式是这样:首先给角色设定是否启用数据权限。多个角色中生效范围最小的
具体实现是这样的:
以之前提到的的博客网站为例,
首先先创建一个继承了BaseEntity的类Article。
然后在控制器的方法头顶上标出注解“@DataScope()”
注意,如果有用联表查询则需要写出mapper xml中sql语句里 sys_user表的别名。我用的别名是“u”,所以应该写成@DataScope(userAlias = "u") 。如果是联部门表sys_dept的话则为deptAlias = "..."
然后在控制器方法的参数中写上类,也就是Article类。(如上图所示)
这样在执行到这个方法时,若依框架会根据当前用户,往article类上挂上sql语句。
确保xml文件中sql语句的 <where>标签内添加了${params.dataScope}
接下来将这个类传递给mybatis的mapper,就大功告成了。
再来整理一下数据权限的使用流程:
- 角色配置数据权限
- entity继承BaseEntity
- 控制器添加@DataScope注解,方法参数传递entity
- 将entity传递给mapper
- mapper内的sql末尾添加params.dataScope
这样我们就实现了根据当前登录用户过滤数据的数据权限功能。