跳转至

权限控制测试案例

权限问题经常不是页面按钮隐藏这么简单。真正需要验证的是:没有权限的人,即使直接调用接口,也不能看到或操作不属于自己的数据。

需求背景

系统有普通用户、客服、管理员三类角色。普通用户只能查看自己的订单;客服可以查看订单但不能修改价格;管理员可以管理用户和订单。

测试点拆解

维度 测试点
未登录 未登录访问页面和接口
角色权限 普通用户、客服、管理员可见菜单和可操作按钮
水平越权 用户 A 访问用户 B 的订单
垂直越权 普通用户访问管理员接口
数据范围 客服只能看分配范围内的数据
前端控制 按钮隐藏、菜单隐藏
后端控制 直接调用接口仍要校验权限
token 过期、伪造、替换 token

用例示例

编号 测试点 步骤 预期结果
AUTH-001 未登录访问订单页 清空登录态后访问订单页 跳转登录页或返回 401
AUTH-002 普通用户访问自己订单 用户 A 登录查看自己的订单 查看成功
AUTH-003 水平越权 用户 A 修改请求中的订单 ID 为用户 B 的订单 拒绝访问,不返回用户 B 数据
AUTH-004 普通用户访问管理员接口 用普通用户 token 请求 /admin/users 返回 403 或无权限
AUTH-005 客服修改订单价格 客服调用修改价格接口 拒绝操作
AUTH-006 管理员操作 管理员修改订单备注 操作成功并记录日志

接口验证重点

不要只看页面按钮是否隐藏。测试时要用 Postman 或 Burp 直接请求接口:

GET /api/orders/10001
Authorization: Bearer 用户A的token

然后把订单 ID 改成用户 B 的订单 ID,观察是否能访问。

测试数据准备

数据 用途
普通用户 A 验证只能访问自己的订单
普通用户 B 作为水平越权目标用户
客服账号 验证查看权限和禁止修改价格
管理员账号 验证管理功能和操作日志
用户 A 订单 正常访问基准数据
用户 B 订单 越权访问测试数据

准备数据时要记录用户 ID、订单 ID、角色和 token,执行后再清理测试订单或恢复权限。

执行步骤示例

  1. 分别登录普通用户 A、普通用户 B、客服、管理员,保存各自 token。
  2. 用户 A 正常查看自己的订单,确认基准请求可用。
  3. 用户 A 把订单 ID 改成用户 B 的订单 ID,检查是否被拒绝。
  4. 普通用户直接请求管理员接口,检查是否返回 403 或无权限。
  5. 客服尝试修改订单价格,确认后端拒绝。
  6. 管理员执行敏感操作后,检查操作日志是否记录操作人和时间。

SQL 校验示例

SELECT id, username, role
FROM users
WHERE username IN ('user_a', 'user_b', 'service_01', 'admin_01');

SELECT id, user_id, status
FROM orders
WHERE id IN (10001, 10002);

SELECT operator_id, action, target_id, created_at
FROM operation_logs
WHERE target_id = 10001
ORDER BY created_at DESC;

缺陷示例

字段 内容
标题 普通用户修改订单 ID 后可查看他人订单详情
前置条件 用户 A 和用户 B 均存在订单
复现步骤 用户 A 登录后请求 /api/orders/{用户B订单ID}
实际结果 接口返回用户 B 的订单收货人、手机号和金额
期望结果 返回 403、404 或无权限提示,不返回任何用户 B 数据
影响 隐私数据泄露,属于高风险越权问题

容易漏测

  • 前端隐藏按钮,但接口没有权限校验。
  • 只能防止未登录,不能防止越权。
  • 用户只能看列表,但能通过详情接口看别人的数据。
  • 管理员权限过大,没有操作日志。
  • token 过期后接口仍可访问。

复盘问题

  • 什么是水平越权?什么是垂直越权?
  • 为什么权限必须在后端校验?
  • 敏感操作为什么需要记录操作日志?