Appearance
概述
EBAOZU 系统采用基于 JWT (JSON Web Token) 的身份认证机制,结合 RBAC (基于角色的访问控制) 实现对平台多端(总后台、门店端、供应商端、用户端等)的安全访问控制与权限隔离。
认证机制与 Token 管理
Token 解析与生命周期
- Token 编码/解析工具:
crmeb\utils\JwtAuth - 解析统一规范:所有端统一通过
crmeb\utils\JwtAuth::parse()解析 Token,无效或过期时统一抛出410003异常码。 - Token 桶缓存:登录成功生成的 Token 会缓存至 Redis(
CacheService::setTokenBucket),用于支持主动注销与密码修改后的全局 Token 失效。
php
use crmeb\utils\JwtAuth;
use crmeb\services\CacheService;
/** @var JwtAuth $jwtAuth */
$jwtAuth = app()->make(JwtAuth::class);
// 1. 生成 Token
$tokenInfo = $jwtAuth->createToken($userId, 'admin', md5($password));
// 2. 存入 Redis 令牌桶缓存
CacheService::setTokenBucket(md5($tokenInfo['token']), [
'uid' => $userId,
'type' => 'admin',
'exp' => time() + $tokenInfo['params']['exp']
], $tokenInfo['params']['exp']);各端鉴权中间件体系
| 端 | 认证中间件 | 权限验证中间件 | 注入 Request 属性 |
|---|---|---|---|
| 平台总后台 | AdminAuthTokenMiddleware | AdminCkeckRoleMiddleware | $request->adminId, $request->adminInfo |
| 移动端/API | AuthTokenMiddleware | - | $request->uid, $request->user() |
| 门店后台 | AuthTokenMiddleware (store) | StoreCkeckRoleMiddleware | $request->storeId, $request->storeInfo |
| 供应商端 | AuthTokenMiddleware (supplier) | SupplierCkeckRoleMiddleware | $request->supplierId |
后台 RBAC 权限控制
权限数据表
eb_system_menus:定义所有菜单节点与 API 权限项(包含api_url与methods);eb_system_role:定义角色及其拥有的权限规则 ID 集合(rules字段);eb_system_admin:管理员账号,关联角色 ID 列表(roles字段)。
权限校验流程 (AdminCkeckRoleMiddleware)
收到后台请求 → 校验 Token 提取 adminId
│
▼
判断管理员 level == 0 (超级管理员直接放行)
│
▼
匹配请求的 API 路由与 HTTP Method 是否在系统受控权限列表中
│
▼
比对管理员角色关联的 rules 集合中是否包含该接口
│
├── 包含 ──→ 放行执行控制器业务
└── 不包含 ─→ 抛出 AuthException (无访问权限)控制器中获取鉴权信息
在继承 app\basic\OpenBaseController 的控制器中,可直接通过 $request 获取当前登录身份:
php
namespace app\controller\admin\v1\custom;
use app\basic\OpenBaseController;
use app\Request;
class CustomController extends OpenBaseController
{
public function index(Request $request)
{
// 获取当前管理员 ID
$adminId = $request->adminId();
// 获取管理员完整信息
$adminInfo = $request->adminInfo();
return app('json')->success(['admin_id' => $adminId]);
}
}php
namespace app\controller\api\v1\user;
use app\basic\OpenBaseController;
use app\Request;
class UserController extends OpenBaseController
{
public function profile(Request $request)
{
// 获取用户 UID
$uid = $request->uid();
// 获取用户信息
$user = $request->user();
return app('json')->success(['uid' => $uid, 'user' => $user]);
}
}二开注意事项
- 统一异常捕获:鉴权不通过时直接抛出
\crmeb\exceptions\AuthException,严禁在控制器中直接echo或使用原生exit。 - 免鉴权路由:如需新增免登录或公开接口,应将其配置在对应路由文件的未绑定 Auth 中间件的 Group 中。
- 接口与菜单匹配:后台新建功能接口若需分配给非超管角色,必须在后台菜单管理中准确配置路由 URL 与请求方法。