温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

动态SQL如何做权限控制

发布时间:2026-09-08 21:32:15 来源:亿速云 阅读:84 作者:小樊 栏目:数据库

动态 SQL(如 MyBatis 的 <if>/<choose>/<foreach> 等) 中进行权限控制,核心思路是:在 SQL 生成阶段就根据当前用户权限决定可见的数据范围或可见字段,而不是在业务代码里“先查再过滤”。

下面按常见场景和方法系统说明。


一、基于「数据范围」的权限控制(最常用)

1️⃣ 行级权限(只能看某些数据)

思路:根据用户角色/部门/权限,动态拼接 WHERE 条件。

示例(MyBatis)

<select id="listUser" resultType="User">
  SELECT * FROM sys_user
  WHERE 1=1
  <if test="role == 'ADMIN'">
    <!-- 管理员看全部 -->
  </if>
  <if test="role == 'DEPT_MANAGER'">
    AND dept_id = #{deptId}
  </if>
  <if test="role == 'USER'">
    AND create_by = #{userId}
  </if>
</select>

✅ 优点:简单直观
❌ 缺点:SQL 分散,权限逻辑易重复


2️⃣ 使用「数据权限拦截器」(推荐)

更优雅的方式
通过 MyBatis 拦截器,在 SQL 执行前自动追加权限条件。

思路

  • 定义注解:@DataPermission
  • 拦截 Executor.query
  • 根据当前用户权限,自动追加:
    AND dept_id IN (...)
    

伪代码

if (hasPermission("DEPT")) {
    sql += " AND dept_id = " + currentDeptId;
}

✅ 优点:

  • SQL 干净
  • 权限统一控制
  • 避免“忘记加条件”

✅ 常用于:

  • 多租户
  • 部门数据隔离
  • 行级安全

二、基于「字段」的权限控制

3️⃣ 控制字段是否返回(列级权限)

场景

  • 普通用户看不到 salary
  • 管理员可以看到

动态 SQL 实现

<select id="getUser">
  SELECT
    id,
    username,
    <if test="showSalary">
      salary,
    </if>
    create_time
  FROM user
</select>

或:

<if test="role == 'ADMIN'">
  , salary
</if>

✅ 适合字段少、规则简单的场景


4️⃣ 使用 ResultMap + 权限过滤

if (!hasPermission("SALARY")) {
    user.setSalary(null);
}

✅ 适合:

  • 返回对象后处理
  • 权限规则复杂

三、基于「菜单 / 接口」的权限控制(配合动态 SQL)

5️⃣ 根据权限决定 SQL 分支

<choose>
  <when test="permission.contains('EXPORT_ALL')">
    AND status != 'DELETED'
  </when>
  <otherwise>
    AND status = 'NORMAL'
  </otherwise>
</choose>

四、多租户场景(特殊权限)

6️⃣ 租户隔离(Tenant ID)

<if test="tenantId != null">
  AND tenant_id = #{tenantId}
</if>

或使用拦截器统一追加。


五、最佳实践总结 ✅

场景 推荐方式
行级权限 拦截器 / 动态 WHERE
部门数据隔离 拦截器
字段权限 动态 SQL / 后处理
多租户 租户拦截器
简单系统 <if> 判断

六、常见坑 ⚠️

  1. 权限判断写在 Java 但 SQL 没限制 → 越权
  2. OR 条件导致权限失效
    AND (dept_id = 1 OR 1=1)
    
  3. 动态 SQL 拼接字符串(SQL 注入)

如果你愿意,我可以:

  • 给你一个 MyBatis 权限拦截器完整示例
  • 或结合 Spring Security / Sa-Token
  • 或针对 多租户 / 数据权限平台 设计模型

你现在的权限控制是 角色 / 部门 / 字段 / 多租户 哪种?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI