快速了解

项目简介

RuoYi是一款基于SpringBoot+Bootstrap的极速后台开发框架。

RuoYi 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf、Bootstrap),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告等。在线定时任务配置;支持集群,支持多数据源。

主要特性

  • 完全响应式布局(支持电脑、平板、手机等所有主流设备)
  • 强大的一键生成功能(包括控制器、模型、视图、菜单等)
  • 支持多数据源,简单配置即可实现切换。
  • 支持按钮及数据权限,可自定义部门数据权限。
  • 对常用js插件进行二次封装,使js代码变得简洁,更加易维护
  • 完善的XSS防范及脚本过滤,彻底杜绝XSS攻击
  • Maven多项目依赖,模块及插件分项目,尽量松耦合,方便模块升级、增减模块。
  • 国际化支持,服务端及客户端支持
  • 完善的日志记录体系简单注解即可实现

技术选型

1、系统环境

  • Java EE 8
  • Servlet 3.0
  • Apache Maven 3

2、主框架

  • Spring Boot 2.0
  • Spring Framework 5.0
  • Apache Shiro 1.4

3、持久层

  • Apache MyBatis 3.4
  • Hibernate Validation 6.0
  • Alibaba Druid 1.1

4、视图层

  • Bootstrap 3.3
  • Thymeleaf 3.0

内置功能

  • 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
  • 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
  • 岗位管理:配置系统用户所属担任职务。
  • 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
  • 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
  • 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
  • 参数管理:对系统动态配置常用参数。
  • 通知公告:系统通知公告信息发布维护。
  • 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
  • 登录日志:系统登录日志记录查询包含登录异常。
  • 在线用户:当前系统中活跃用户状态监控。
  • 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
  • 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。
  • 系统接口:根据业务代码自动生成相关的api接口文档。
  • 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。
  • 在线构建器:拖动表单元素生成相应的HTML代码。
  • 连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。

历史漏洞

  • 命令执行漏洞 RuoYi <= v4.3.0

若依管理系统使用了Apache Shiro,Shiro 提供了记住我(RememberMe)的功能,下次访问时无需再登录即可访问。系统将密钥硬编码在代码里,且在官方文档中并没有强调修改该密钥,导致框架使用者大多数都使用了默认密钥。攻击者可以构造一个恶意的对象,并且对其序列化、AES加密、base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞,进而在目标机器上执行任意命令。

检测漏洞:ShiroConfig.java 是否包含 fCq+/xW488hMTCD+cmJ3aQ==,如果是使用的默认密钥则需要修改,防止被执行命令攻击。

解决方案:升级版本到 >=v.4.3.1,并且重新生成一个新的秘钥替换cipherKey,保证唯一且不要泄漏。

# Shiro
shiro:
  cookie:
    # 设置密钥,务必保持唯一性(生成方式,直接拷贝到main运行即可)KeyGenerator keygen = KeyGenerator.getInstance("AES"); SecretKey deskey = keygen.generateKey(); System.out.println(Base64.encodeToString(deskey.getEncoded()));
    cipherKey: zSyK5Kp6PZAAjlT+eeNMlg==
1
2
3
4
5
// 直接拷贝到main运行即可生成一个Base64唯一字符串
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecretKey deskey = keygen.generateKey();
System.out.println(Base64.encodeToString(deskey.getEncoded()));
1
2
3
4
  • SQL注入攻击 RuoYi <= v3.2.0

若依管理系统使用了PageHelper,PageHelper提供了排序(Order by)的功能,前端直接传参完成排序。系统没有做字符检查,导致存在被注入的风险,最终造成数据库中存储的隐私信息全部泄漏。

检测漏洞:BaseController.java 是否包含 String orderBy = pageDomain.getOrderBy();,如果没有字符检查需要修改,防止被执行注入攻击。

解决方案:升级版本到 >=v.3.2.0,或者重新添加字符检查String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());,防止注入绕过。

package com.ruoyi.common.utils.sql;

import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.StringUtils;

/**
 * sql操作工具类
 * 
 * @author ruoyi
 */
public class SqlUtil
{
    /**
     * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
     */
    public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";

    /**
     * 检查字符,防止注入绕过
     */
    public static String escapeOrderBySql(String value)
    {
        if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
        {
            throw new BaseException("参数不符合规范,不能进行查询");
        }
        return value;
    }

    /**
     * 验证 order by 语法是否符合规范
     */
    public static boolean isValidOrderBySql(String value)
    {
        return value.matches(SQL_PATTERN);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  • Shiro阻止权限绕过漏洞 RuoYi <= v4.3.0

Shiro < 1.5.2 版本存在一处权限绕过漏洞,当受影响版本的Shiro框架结合Spring dynamic controllers使用时,未经授权的远程攻击者可以通过精心构造的请求包进行权限绕过,可能造成鉴权系统失效以及后台功能暴露。

检测漏洞:pom.xml Shiro <=1.5.2 则版本存在漏洞。

解决方案:升级版本到 >=1.5.3

  • Fastjson高危漏洞 RuoYi <= v4.2.0

Fastjson < 1.2.68 版本存在一处反序列化漏洞,主要为autoType开关绕过的反序列化漏洞利用,恶意攻击者可以通过该漏洞绕过autoType限制实现远程代码执行攻击,从而获取目标系统管理权限,建议尽快更新漏洞修复版本或采用临时缓解措施加固系统。

检测漏洞:pom.xml Fastjson <=1.2.68 则版本存在漏洞。

解决方案:升级版本到 >=1.2.70

注意

若依平台的默认口令 admin/admin123,请大家在线上环境一定要修改超级管理员的密码。
SysPasswordService.encryptPassword(String username, String password, String salt)
直接到main运行此方法,填充账号密码及盐(保证唯一),生成md5加密字符串。

更新日志

  • v4.3.1 2020-07-05

    • 国家信息安全漏洞(请务必保持cipherKey密钥唯一性)
    • 升级shiro到最新版1.5.3 阻止权限绕过漏洞
    • 修改验证码在使用后清除,防止多次使用
    • 检查字符支持小数点&降级改成异常提醒
    • openOptions函数中加入自定义maxmin属性
    • 支持openOptions方法最大化
    • 支持openOptions方法多个按钮回调
    • 新增isLinkage支持页签与菜单联动
    • 修改代码生成导入表结构出现异常页面不提醒问题
    • 优化用户头像发生错误,则显示一个默认头像
    • Excel导出支持字典类型
  • v4.3.0 2020-06-22

    • 代码生成模板支持主子表
    • 代码生成显示类型支持复选框
    • 前端表单样式修改成圆角
    • 新增回显数据字典(字符串数组)
    • 修复浏览器手动缩放比例后菜单无法自适应问题
    • 限制用户不允许选择系统管理员角色
    • 用户信息添加输入框组图标&鼠标按下显示密码
    • 升级fastjson到最新版1.2.70 修复高危安全漏洞
    • 升级Bootstrap版本到v3.3.7
    • 修复selectColumns方法获取子对象数据无效问题
    • 修改数据源类型优先级,先根据方法,再根据类
    • 修改上级部门(选择项排除本身和下级)
    • 首页菜单显示调整
    • 添加是否开启swagger配置
    • 新增示例(主子表提交)
    • 新增示例(多级联动下拉示例)
    • 新增示例(表格属性data数据加载)
    • 新增表格列参数(是否列选项可见ignore)
    • 新增表格参数(是否启用显示卡片视图cardView)
    • 新增表格参数(是否显示全屏按钮showFullscreen)
    • 新增表格参数(是否启用分页条无限循环的功能paginationLoop)
    • 新增表格参数(是否显示表头showHeader)
    • 表格添加显示/隐藏所有列方法 showAllColumns/hideAllColumns
    • 修复部分情况节点不展开问题
    • 修复关闭标签页后刷新还是上次地址问题
    • 修复选择菜单后刷新页面,菜单箭头显示不对问题
    • 修复jquery表单序列化时复选框未选中不会序列化到对象中问题
    • Excel支持readConverterExp读取字符串组内容
    • 更换IP地址查询接口
    • 默认关闭获取ip地址
    • 操作处理ajaxSuccess判断修正
    • HttpUtils.sendPost()方法,参数无需拼接参数到url
    • 通用http发送方法增加参数 contentType 编码类型
    • HTML过滤器不替换&实体
    • 代码生成浮点型改用BigDecimal
    • 修复表单构建单选和多选框渲染问题
    • 代码生成模板调整,字段为String并且必填则加空串条件
    • 字典数据查询列表根据dictSort升序排序
    • 修复树表对imageView和tooltip方法无效问题
    • 修复Long类型比较相等问题调整
    • 示例demo页面清除html链接,防止点击后跳转出现404
    • 在线用户强退方法合并
    • 添加校验部门包含未停用的子部门
    • 取消回车自动提交表单
    • 'A','I','BUTTON' 标签忽略clickToSelect事件,防止点击操作按钮时选中
    • 邮箱显示截取部分字符串,防止低分辨率错位
    • 代码生成列属性根据sort排序
    • 修复更多操作部分浏览器不兼容情况
    • 图片预览事件属性修正
    • 修复冻结列排序样式无效问题
    • 修复context-path的情况下个人中心刷新导致样式问题
    • 全屏editFull打开适配表树
    • 其他细节优化
  • v4.2.0 2020-03-23

    • 用户管理添加分配角色页面
    • 定时任务添加调度日志按钮
    • 新增是否开启用户注册功能
    • 新增页面滚动显示返回顶部按钮
    • 用户&角色&任务添加更多操作按钮
    • iframe框架页会话过期弹出超时提示
    • 移动端登录不显示左侧菜单
    • 侧边栏添加一套深蓝色主题
    • 首页logo固定,不随菜单滚动
    • 支持mode配置history(表示去掉地址栏的#)
    • 任务分组字典翻译(调度日志详细)
    • 字典管理添加缓存读取
    • 字典数据列表标签显示样式
    • 参数管理支持缓存操作
    • 日期控件清空结束时间设置开始默认值为2099-12-31
    • 表格树添加获取数据后响应回调处理
    • 批量替换表前缀调整
    • 支持表格导入模板的弹窗表单加入其它输入控件
    • 表单重置刷新表格树
    • 新增支持导出数据字段排序
    • 新增表格参数(是否单选checkbox)
    • druid未授权不允许访问
    • 表格树父节点兼容0,'0','',null
    • 表单必填的项添加星号
    • 修复select2不显示校验错误信息
    • 添加自定义HTML过滤器
    • 修复多数据源下开关关闭出现异常问题
    • 修复翻页记住选择项数据问题
    • 用户邮箱长度限制20
    • 修改错误页面返回主页出现嵌套问题
    • 表格浮动提示单双引号转义
    • 支持配置四级菜单
    • 升级shiro到最新版1.4.2 阻止rememberMe漏洞攻击
    • 升级summernote到最新版本v0.8.12
    • 导入Excel根据dateFormat属性格式处理
    • 修复War部署无法正常shutdown,ehcache内存泄漏
    • 修复代码生成短字段无法识别问题
    • 修复serviceImpl模版,修改方法判断日期错误
    • 代码生成模板增加导出功能日志记录
    • 代码生成唯一编号调整为tableId
    • 代码生成查询时忽略大小写
    • 代码生成支持翻页记住选中
    • 代码生成表注释未填写也允许导入
    • Global全局配置类修改为注解,防止多环境配置下读取问题
    • 修复多表格情况下,firstLoad只对第一个表格生效
    • 处理Maven打包出现警告问题
    • 默认主题样式,防止网速慢情况下出现空白
    • 修复文件上传多级目录识别问题
    • 锚链接解码url,防止中文导致页面不能加载问题
    • 修复右键Tab页刷新事件重复请求问题
    • 角色禁用&菜单隐藏不查询权限
    • 其他细节优化
  • v4.1.0 2019-10-22

    • 支持多表格实例操作
    • 浮动提示方法tooltip支持弹窗
    • 代码生成&字典数据支持模糊条件查询
    • 增加页签全屏方法
    • 增加清除表单验证错误信息方法
    • 支持iframe局部刷新页面
    • 支持在线切换主题
    • 修改图片预览设置的高宽参数颠倒问题
    • 操作日志新增解锁账户功能
    • 管理员用户&角色不允许操作
    • 去掉jsoup包调用自定义转义工具
    • 添加时间轴示例
    • 修复翻页记住选择时获取指定列值的问题
    • 代码生成sql脚本添加导出按钮
    • 添加表格父子视图示例
    • 添加表格行内编辑示例
    • 升级fastjson到最新版1.2.60 阻止漏洞攻击
    • 升级echarts到最新版4.2.1
    • 操作日志新增返回参数
    • 支持mybatis通配符扫描任意多个包
    • 权限验证多种情况处理
    • 修复树形类型的代码生成的部分必要属性无法显示
    • 修复非表格插件情况下重置出现异常
    • 修复富文本编辑器有序列表冲突
    • 代码生成表前缀配置支持多个
    • 修复自动去除表前缀配置无效问题
    • 菜单列表按钮数据可见不显示(权限标识控制)
    • 修复设置会话超时时间无效问题
    • 新增本地资源通用下载方法
    • 操作日志记录新增请求方式
    • 代码生成单选按钮属性重名修复
    • 优化select2下拉框宽度不会随浏览器改变
    • 修复代码生成树表异常
    • 其他细节优化
  • v4.0.0 2019-08-08

    • 代码生成支持预览、编辑,保存方案
    • 新增防止表单重复提交注解
    • 新增后端校验(和前端保持一致)
    • 新增同一个用户最大会话数控制
    • Excel导出子对象支持多个字段
    • 定时任务支持静态调用和多参数
    • 定时任务增加分组条件查询
    • 字典类型增加任务分组数据
    • 新增表格是否首次加载数据
    • 新增parentTab选项卡可在同一页签打开
    • 多数据源支持类注解(允许继承父类的注解)
    • 部门及以下数据权限(调整为以下及所有子节点)
    • 新增角色数据权限配(仅本人数据权限)
    • 修改菜单权限显示问题
    • 上传文件修改路径及返回名称
    • 添加报表插件及示例
    • 添加首页统计模板
    • 添加表格拖拽示例
    • 添加卡片列表示例
    • 添加富文本编辑器示例
    • 添加表格动态增删改查示例
    • 添加用户页面岗位选择框提示
    • 点击菜单操作添加背景高亮显示
    • 表格树新增showSearch是否显示检索信息
    • 解决表格列设置sortName无效问题
    • 表格图片预览支持自定义设置宽高
    • 添加表格列浮动提示(单击文本复制)
    • PC端收起菜单后支持浮动显示
    • 详细操作样式调整
    • 修改用户更新描述空串不更新问题
    • 导入修改为模板渲染
    • 修改菜单及部门排序规则
    • 角色导出数据范围表达式翻译
    • 添加summernote富文本字体大小
    • 优化表格底部下边框防重叠&汇总像素问题
    • 树表格支持属性多层级访问
    • 修复IE浏览器用户管理界面右侧留白问题
    • 重置按钮刷新表格
    • 重置密码更新用户缓存
    • 优化验证码属性参数
    • 支持数据监控配置用户名和密码
    • 文件上传修改按钮背景及加载动画
    • 支持配置一级菜单href跳转
    • 侧边栏添加一套浅色主题
    • 树表格添加回调函数(校验异常状态)
    • 用户个人中心适配手机端显示
    • Excel支持设置导出类型&更换样式
    • 检查属性改变修改为克隆方式(防止热部署强转异常)
    • 其他细节优化
  • v3.4.0 2019-06-03

    • 新增实例演示菜单及demo
    • 新增页签右键操作
    • 菜单管理新增打开方式
    • 新增点击某行触发的事件
    • 新增双击某行触发的事件
    • 新增单击某格触发的事件
    • 新增双击某格触发的事件
    • 新增是否启用显示细节视图
    • 支持上传任意格式文件
    • 修复角色权限注解失效问题
    • 左侧的菜单栏宽度调整
    • 新增响应完成后自定义回调函数
    • 支持前端及其他模块直接获取用户信息
    • 升级swagger到最新版2.9.2
    • 升级jquery.slimscroll到最新版1.3.8
    • 升级select2到最新版4.0.7
    • 新增角色配置本部门数据权限
    • 新增角色配置本部门及以下数据权限
    • 优化底部操作防止跳到页面顶端
    • 修改冻结列选框无效及样式问题
    • 修复部门四层级修改祖级无效问题
    • 更换开关切换按钮样式
    • 新增select2-bootstrap美化下拉框
    • 添加表格内图片预览方法
    • 修复权限校验失败跳转页面路径错误
    • 国际化资源文件调整
    • 通知公告布局调整
    • 删除页签操作功能
    • 表格树新增查询指定列值
    • 更改系统接口扫描方式及完善测试案例
    • 表格列浮动提示及字典回显默认去背景
    • 修复启用翻页记住前面的选择check没选中问题
    • 去除监控页面底部的广告
    • 日期控件功问题修复及data功能增强
    • 新增角色权限可见性(前端直接调用)
    • 新增获取当前登录用户方法(前端及子模块调用)
    • 修复热部署重启导致菜单丢失问题
    • 优化业务校验失败普通请求跳转页面
    • 操作日志新增状态条件查询
    • 操作类型支持多选条件查询
    • 通知公告防止滚动触底回弹优化
    • 其他细节优化
  • v3.3.0 2019-04-01

    • 新增线程池统一管理
    • 新增支持左右冻结列
    • 新增表格字符超长浮动提示
    • 升级datepicker拓展并汉化
    • 升级druid到最新版本v1.1.14
    • 修复个人头像为图片服务器跨域问题
    • 修改上传文件按日期存储
    • 新增表格客户端分页选项
    • 新增表格的高度参数
    • 新增表格销毁方法
    • 新增表格下拉按钮切换方法
    • 新增表格分页跳转到指定页码
    • 新增表格启用点击选中行参数
    • 修复表格数据重新加载未触发部分按钮禁用
    • 使用jsonview展示操作日志参数
    • 新增方法(addTab、editTab)
    • 修改用户管理界面为Tab打开方式
    • 表单验证代码优化
    • 修复@Excel注解 prompt 属性使用报错
    • 修复combo属性Excel兼容性问题
    • 新增@Excel导入导出支持父类字段
    • 修复关闭最后选项卡无法激活滚动问题
    • 增加日期控件显示类型及回显格式扩展选项
    • 修复定时任务执行失败后入库状态为成功状态
    • 支持定时任务并发开关控制
    • 优化权限校验失败普通请求跳转页面
    • 捕获线程池执行任务抛出的异常
    • 修复IE浏览器导出功能报错
    • 新增角色管理分配用户功能
    • 新增表格翻页记住前面的选择
    • 调整用户个人中心页面
    • 修复界面存在的一些安全问题
    • 其他细节优化
  • v3.2.0 2019-01-16

    • 部门修改时不允许选择最后节点
    • 修复部门菜单排序字段无效
    • 修复光驱磁盘导致服务监控异常
    • 登录界面去除check插件
    • 验证码文本字符间距修正
    • 升级SpringBoot到最新版本2.1.1
    • 升级MYSQL驱动
    • 修正登录必填项位置偏移
    • Session会话检查优化
    • Excel注解支持多级获取
    • 新增序列号生成方法
    • 修复WAR部署tomcat退出线程异常
    • 全屏操作增加默认确认/关闭
    • 修复个人信息可能导致漏洞
    • 字典数据根据下拉选择新增类型
    • 升级Summernote到最新版本v0.8.11
    • 新增用户数据导入
    • 首页主题样式更换
    • layer扩展主题更换
    • 用户管理移动端默认隐藏左侧布局
    • 详细信息弹出层显示在顶层
    • 表格支持切换状态(用户/角色/定时任务)
    • Druid数据源支持配置继承
    • 修正部分iPhone手机端表格适配问题
    • 新增防止重复提交表单方法
    • 新增表格数据统计汇总方法
    • 支持富文本上传图片文件
  • v3.1.0 2018-12-03

    • 新增内网不获取IP地址
    • 新增cron表达式有效校验
    • 定时任务新增详细信息
    • 定时任务默认策略修改(不触发立即执行)
    • 定时任务显示下一个执行周期
    • 支持前端任意日期格式处理
    • 上传头像删除多余提交按钮
    • 表格增加行间隔色配置项
    • 表格增加转义HTML字符串配置项
    • 表格增加显示/隐藏指定列
    • 代码生成优化
    • 操作日志参数格式化显示
    • 页签新增新增全屏显示
    • 新增一键打包部署
    • Excel注解新增多个参数
    • 新增提交静默更新表格方法
    • 新增服务监控菜单
  • v3.0.0 2018-10-08

    • 升级poi到最新版3.17
    • 导出修改临时目录绝对路径
    • 升级laydate升级到最新版5.0.9
    • 升级SpringBoot到最新版本2.0.5
    • 优化开始/结束时间校验限制
    • 重置密码参数表中获取默认值
    • 修复头像修改显示问题
    • 新增数据权限过滤注解
    • 新增表格检索折叠按钮
    • 新增清空(登录、操作、调度)日志
    • 固定按钮位置(提交/关闭)
    • 部门/菜单支持(展开/折叠)
    • 部分细节调整优化
    • 项目采用分模块