Skip to content

概述

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 属性
平台总后台AdminAuthTokenMiddlewareAdminCkeckRoleMiddleware$request->adminId, $request->adminInfo
移动端/APIAuthTokenMiddleware-$request->uid, $request->user()
门店后台AuthTokenMiddleware (store)StoreCkeckRoleMiddleware$request->storeId, $request->storeInfo
供应商端AuthTokenMiddleware (supplier)SupplierCkeckRoleMiddleware$request->supplierId

后台 RBAC 权限控制

权限数据表

  • eb_system_menus:定义所有菜单节点与 API 权限项(包含 api_urlmethods);
  • 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]);
    }
}

二开注意事项

  1. 统一异常捕获:鉴权不通过时直接抛出 \crmeb\exceptions\AuthException,严禁在控制器中直接 echo 或使用原生 exit
  2. 免鉴权路由:如需新增免登录或公开接口,应将其配置在对应路由文件的未绑定 Auth 中间件的 Group 中。
  3. 接口与菜单匹配:后台新建功能接口若需分配给非超管角色,必须在后台菜单管理中准确配置路由 URL 与请求方法。

承信租多门店租赁商城系统官方文档