安全体系深度对比:Sa-Token JWT + RBAC + 数据权限 vs Spring Security + Shiro

发布时间:2026/7/29 3:02:47

安全体系深度对比:Sa-Token JWT + RBAC + 数据权限 vs Spring Security + Shiro 安全不是有没有而是防了多少层Java Web开发中安全框架的选择几乎是个路线之争Spring Security功能强大但配置复杂Shiro简单易用但功能受限Sa-Token作为后起之秀在易用性和功能完整性之间找到了平衡。Web应用的安全防护不是单一机制能解决的问题——认证、授权、数据过滤、传输加密、攻击防护每一层都需要对应的策略。本文从认证框架、权限模型、数据权限、攻击防护、加密体系五个维度对比忆笙智云、若依、JeecgBoot三款平台的安全方案。认证框架对比维度忆笙智云若依JeecgBoot认证框架Sa-Token 1.43.0Spring Security / Shiro分版本Apache ShiroToken模式JWT Simple模式JWT / SessionJWT / Session登录方式账号密码 验证码 短信账号密码 验证码账号密码 验证码多端登录支持Web/App/小程序分版本支持支持会话管理Token自动续期 踢人下线Session管理Session管理同端互斥支持不支持不支持Sa-Token vs Spring Security vs ShiroSa-Token是一个轻量级的Java权限认证框架它的设计理念是API简单功能完整。相比Spring Security和ShiroSa-Token有三个显著特点1. 配置量差异// Spring Security 实现一个简单的RBAC需要写// - SecurityConfig 配置类50行// - UserDetailsService 实现类// - JwtTokenFilter 过滤器// - JwtTokenProvider 工具类// 总计约 200 行代码// Sa-Token 实现同样的RBAC// 1. 引入依赖// 2. 配置 application.ymlsa-token:token-name:satoken timeout:2592000is-concurrent:falsejwt-secret-key:abcdefghijklmnopqrstuvwxyz// 3. 登录接口调用 StpUtil.login(userId)// 4. 权限注解 SaCheckPermission(sys:user:list)// 总计约 20 行配置 注解2. JWT Simple模式忆笙智云使用了Sa-Token的JWT Simple模式这种模式的特点是Token本身是JWT格式包含用户ID等基本信息不需要依赖Redis存储会话与纯JWT不同的是Sa-Token的JWT Simple模式仍然保留了服务端主动控制会话的能力踢人下线、封禁账号纯JWT模式下Token一旦签发就无法从服务端使其失效除非等到过期Sa-Token的JWT Simple模式解决了这个问题3. API设计Sa-Token的API设计非常直观// 登录StpUtil.login(10001);// 检查是否登录StpUtil.isLogin();// 获取当前用户IDStpUtil.getLoginId();// 踢人下线StpUtil.kickout(10001);// 角色权限检查StpUtil.hasRole(admin);StpUtil.checkPermission(sys:user:add);若依的Spring Security版本需要写大量配置和过滤器学习曲线较陡。Shiro版本部分若依分支上手相对简单但功能上不如Sa-Token丰富。JeecgBoot使用Shiro配置量适中但JWT支持不如Sa-Token原生。这里补充几个Sa-Token相对于Spring Security的具体技术优势不是泛泛而谈更简单而是有明确对比的技术点1. 无状态JWT的会话控制。纯Spring Security JWT方案中Token一旦签发就无法在服务端主动失效要实现踢人下线需要额外维护一个黑名单Redis 过滤器实现复杂且容易遗漏。Sa-Token的JWT Simple模式在Token中嵌入了会话信息配合内置的二级缓存机制可以用StpUtil.kickout(userId)一行代码实现踢人下线不需要手写黑名单逻辑。2. 注解式权限校验的粒度。Spring Security的PreAuthorize支持SpEL表达式功能强大但语法复杂如PreAuthorize(hasRole(ADMIN) and #order.userId authentication.principal.id)。Sa-Token的SaCheckPermission和SaCheckRole注解更简洁且支持或关系SaCheckPermission(value order:add, orRole admin)表示有order:add权限或者是admin角色即可Spring Security的SpEL实现同样的逻辑需要更复杂的表达式。3. 二级认证机制。这是Sa-Token独有的功能Spring Security原生不支持。某些敏感操作如删除用户、修改系统配置需要用户二次确认密码Sa-Token提供了StpUtil.openSafe()和StpUtil.closeSafe()接口可以在代码中灵活控制哪些操作需要二级认证认证有效期可独立配置过期后自动要求重新验证。4. 启动速度。在同等功能下Sa-Token的启动时间远快于Spring Security。Spring Security需要初始化完整的过滤器链SecurityFilterChain、认证管理器AuthenticationManager、访问决策器AccessDecisionManager等组件而Sa-Token采用按需加载策略启动时只初始化核心组件其他功能在首次调用时延迟初始化。对于需要快速启动的微服务场景这个差异很实际。权限模型RBAC 数据权限RBAC角色-权限控制三款平台都实现了标准的RBAC模型用户 → 角色 → 权限。但数据权限的粒度差异较大。数据权限数据权限是RBAC的补充——RBAC控制的是能不能访问这个菜单数据权限控制的是能访问这个菜单下的哪些数据。典型的场景一个销售订单页面销售经理可以看到所有订单普通销售员只能看到自己创建的订单华北区经理只能看到华北区的订单。忆笙智云的数据权限实现方式是AOP注解// 在Controller方法上标注数据权限GetMapping(/order/list)DataScope(deptAliasd,// 部门表别名userAliasu,// 用户表别名permissionorder// 权限标识)publicResultlist(OrderQueryquery){// 框架自动在SQL中拼接数据权限过滤条件// 普通用户: WHERE u.create_by #{userId}// 部门经理: WHERE d.dept_id IN (#{deptIds})// 全部数据: 不添加过滤条件returnorderService.page(query);}数据权限有五种粒度1. 全部数据权限 → 不做任何过滤查看所有数据 2. 自定义数据权限 → 根据自定义规则过滤 3. 部门数据权限 → 只能查看本部门的数据 4. 部门及以下数据权限 → 查看本部门及下级部门的数据 5. 仅本人数据权限 → 只能查看自己创建的数据这五种粒度在三款平台中的实现差异我用一个具体的业务场景来说明场景销售订单查询用户张三销售部-华东组成员数据权限级别张三能看到的数据范围忆笙智云若依JeecgBoot全部数据所有订单不限部门✓✓✓自定义数据按自定义SQL过滤如华东区华南区✓✗基础部门数据销售部所有订单✓✓✓部门及以下销售部及下属子部门订单✓✓部分仅本人只有张三自己创建的订单✓✓✓关键差异在于自定义数据权限。忆笙智云的自定义规则允许你写任意SQL片段比如AND o.region IN (‘华东’, ‘华南’)框架会自动拼接到查询SQL的WHERE子句中。若依社区版不支持自定义规则如果业务需要区域经理只能看自己管辖区域这种场景就需要在业务代码中手动拼SQL。JeecgBoot有基础的自定义支持但只能按部门维度不能自定义到字段级别。另一个差异点是多表关联中的数据权限。当查询涉及多张表时比如订单表关联客户表、产品表数据权限过滤条件需要拼到正确的表上。忆笙智云的DataScope注解支持指定deptAlias和userAlias框架知道部门字段和用户字段在哪张表上自动生成正确的SQL JOIN条件。若依和JeecgBoot在多表关联场景下需要开发者手动处理表别名容易出错。数据权限维度忆笙智云若依JeecgBoot数据权限实现方式AOP注解自动拦截手动SQL拼接注解实现权限粒度5种粒度5种粒度3-4种粒度多表关联支持✓部分支持部分支持自定义过滤规则✓✗基础攻击防护CSRF防护CSRF跨站请求伪造攻击的原理是攻击者诱导用户点击一个链接利用用户已登录的身份向目标网站发送恶意请求。忆笙智云使用Sa-Token的CSRF Token机制每次请求需要携带服务端生成的CSRF TokenToken与用户会话绑定每次请求后Token刷新防止重放攻击。// Sa-Token CSRF防护配置sa-token:token-name:satoken is-read-cookie:false# 开启CSRF防护 is-csrf:trueXSS过滤XSS跨站脚本攻击是Web应用中最常见的安全漏洞之一。忆笙智云内置了XSS过滤器// XSS过滤器自动处理请求参数// 用户输入: scriptalert(xss)/script// 过滤后: lt;scriptgt;alert(xss)lt;/scriptgt;攻击防护忆笙智云若依JeecgBootCSRF防护✓ Token机制✓✓XSS过滤✓ 过滤器✓✓SQL注入防护✓ MyBatis参数化✓ MyBatis参数化✓ MyBatis参数化IP黑白名单✓✗✗演示模式✓ 防篡改✓✓IP黑白名单忆笙智云额外的安全防护支持IP黑白名单配置可以按IP段限制访问。这在企业内部系统只允许公司内网IP访问和API服务封禁恶意IP中非常实用。ys:security:ip-blacklist:-192.168.1.100-10.0.0.0/24ip-whitelist:-127.0.0.1-192.168.1.0/24加密体系加密维度忆笙智云若依JeecgBoot密码加密BCryptBCryptBCrypt / MD5盐传输加密HTTPS 敏感字段加密HTTPSHTTPS国密算法SM4✗✗API Key加密SM4无AI模块基础配置文件加密支持基础基础SM4国密算法忆笙智云的差异化能力之一是集成了SM4国密算法。SM4是中国国家密码管理局发布的分组密码算法标准在政务、金融、央企等信创项目中使用国密算法是合规要求。SM4的具体实现基于Bouncy Castle密码库这个库是Java生态中事实上的国密算法标准实现。忆笙智云对SM4的使用不是简单封装一个工具类而是做了一层适配让SM4可以和Spring的加密体系集成// SM4加密工具类 - 核心APIpublicclassSm4Util{// ECB模式加密 - 适合简单场景publicstaticStringencryptEcb(Stringdata,Stringkey){...}// CBC模式加密 - 需要IV向量安全性更高publicstaticStringencryptCbc(Stringdata,Stringkey,Stringiv){...}// 解密publicstaticStringdecrypt(Stringdata,Stringkey){...}// 生成SM4密钥128位publicstaticStringgenerateKey(){...}}// 与Spring配置文件的集成// application.yml 中配置SM4密钥ys:security:sm4:key:${SM4_KEY:default-key-for-dev}# 生产环境从环境变量注入 mode:ECB# 加密模式ECB/CBC实际使用场景有三个第一AI API Key加密存储。忆笙智云接入了13种AI供应商每个供应商的API Key都是敏感凭证。数据库中的api_key字段存储的是SM4加密后的密文即使数据库被拖库攻击者拿到的也是不可用的密文。解密密钥不存储在数据库中而是通过环境变量注入。第二敏感字段加密。用户表中的身份证号、手机号、银行卡号等字段在写入数据库前用SM4加密读取时解密。这样即使运维人员直接查看数据库也看不到明文敏感信息。需要注意的是加密后的字段无法做模糊查询和排序所以在设计表结构时需要权衡哪些字段加密、哪些字段脱敏。第三配置文件加密。生产环境的配置文件application-prod.yml中可能包含数据库密码、Redis密码等敏感信息。忆笙智云支持使用SM4对这些配置值加密应用启动时自动解密避免敏感信息明文出现在配置文件中。SM4与国际通用的AES算法在安全性上处于同一级别都是128位分组密码但SM4是国产自主可控的算法标准。在信创项目的安全评估中是否支持国密算法往往是一个硬性指标。若依和JeecgBoot需要自行集成Bouncy Castle并封装SM4工具类不仅要处理加密解密逻辑还要处理密钥管理、与Spring配置体系的集成、数据库字段的自动加解密等问题开发量不小。实际安全配置示例上面的内容偏理论对比这里给出一个实际的安全配置示例展示忆笙智云在生产环境中如何配置完整的安全防护链# 一、认证配置 sa-token:token-name:satokentimeout:2592000# Token有效期30天active-timeout:1800# 30分钟无操作自动下线is-concurrent:false# 不允许同端并发登录is-share:false# 多端登录互不影响token-style:tik# Token风格uuid/simple-uuid/tikis-log:true# 记录登录日志jwt-secret-key:${JWT_SECRET}# 密钥从环境变量注入# 二、密码策略 ys:security:password:min-length:8# 最小长度max-length:20# 最大长度require-letter:true# 必须包含字母require-digit:true# 必须包含数字require-special:true# 必须包含特殊字符max-retry:5# 最大重试次数超过锁定30分钟lock-time:30# 锁定时间分钟history-size:3# 最近3次密码不可重复使用# 三、CSRF XSS IP防护 csrf:enable:trueexclude-paths:/api/public/*,/api/callback/*xss:enable:trueexclude-paths:/api/rich-text/*ip:enable:truewhitelist:10.0.0.0/8,172.16.0.0/12blacklist:58.218.0.0/16# 四、AI接口安全 ai:token-limit:per-user-daily:10000# 每人每天1万Tokenper-ip-minute:100# 每IP每分钟100次prompt-injection-protect:trueapi-key-storage:sm4-encrypt# API Key加密存储方式这个配置覆盖了从密码策略到AI接口安全的完整防护链。若依和JeecgBoot要达到同样的安全防护层级需要额外开发密码策略校验、IP黑白名单、Token限流、Prompt注入防护等功能模块。场景一小型项目安全要求不高三款平台都能满足基本需求。若依的Spring Security方案虽然配置复杂但网上资料最多遇到问题容易找到解决方案。场景二中型项目需要精细化权限控制忆笙智云和JeecgBoot的数据权限方案更成熟。忆笙智云的AOP注解方式侵入性更低代码改动小。场景三信创项目需要国密合规忆笙智云是目前唯一内置SM4国密支持的Java低代码平台。若依和JeecgBoot需要自行集成国密算法库。场景四多端应用Web App 小程序忆笙智云的Sa-Token JWT Simple模式对多端支持更友好统一的Token认证机制不依赖Cookie和Session。总结安全体系的差异决定了平台能覆盖的业务场景范围若依Spring Security或Shiro的经典方案RBAC成熟但数据权限、IP黑白名单、国密支持需要额外开发。适合安全需求标准化的项目。JeecgBootShiro RBAC 基础数据权限安全防护层级适中。忆笙智云Sa-Token JWT RBAC 5级数据权限AOP CSRF XSS IP黑白名单 BCrypt SM4国密安全防护层级最完整。在信创、政务、金融等对安全有特殊要求的场景中优势明显。开源地址Giteehttps://gitee.com/lqclf/ys-lowcode-openGitHubhttps://github.com/lqclf/ys-code-ai-open在线体验https://admin.yscode.cn/账号ysadmin | 密码Ysadmin123456

相关新闻