GlobalDiscuzXAuthMiddleware — Discuz!X 全局认证中间件
- 文件位置:
kernel/Platform/DiscuzX/Middleware/GlobalDiscuzXAuthMiddleware.php - 命名空间:
kernel\Platform\DiscuzX\Middleware - 继承:
extends GlobalAuthMiddleware→extends MiddlewareBase - 是否可继承: 是
Discuz!X 场景下的全局认证中间件。扩展 GlobalAuthMiddleware,将登录模型替换为 DiscuzXLoginsModel,并针对 Discuz!X 会员系统(getglobal("member"))提供管理员/用户组权限验证,以及登录态注入。
构造
php
public function __construct(Request $request, $controller)$request(Request):请求对象$controller:当前控制器
设置 $this->LoginsModel = DiscuzXLoginsModel::class。
方法
verifyViewControllerAdmin — 验证管理员权限
php
public function verifyViewControllerAdmin()读取 getglobal("member"):
- 控制器
$Admin为true:未登录(uid===0)→ 401DiscuzXAdminAuth:401001;adminid===0→ 401DiscuzXAdminAuth:401002。 - 控制器
$Admin为数组:adminid不在数组内 → 403DiscuzXAdminAuth:403001。 - 控制器
$Admin为数字/字符串:adminid不等 → 403DiscuzXAdminAuth:403002。 adminid===1(创始人)直接通过。
返回 Result。
verifyViewControllerAuth — 验证用户组权限
php
public function verifyViewControllerAuth()读取 getglobal("member"):
- 控制器
$Auth为true:未登录 → 401DiscuzXAuth:401001。 $Auth为数组:groupid不在数组内 → 403DiscuzXAuth:403001。$Auth为数字/字符串:groupid不等 → 403DiscuzXAuth:403002。
返回 Result。
verify — 按类型验证
php
public function verify($viewVerifyType)$viewVerifyType(string):admin走verifyViewControllerAdmin,否则走verifyViewControllerAuth。
login — 注入登录态(private)
php
private function login()逻辑
- 从
$GLOBALS['_STORE']['__App.auth']读取已认证的userId。 - 有则
DiscuzXMember::get($userId)获取会员并setloginstatus()设置 Discuz!X 登录态;无则DiscuzXMember::get(0)。 - 定义常量
DISCUZX_MEMBER_ID(会员 ID)与DISCUZX_MEMBER_LOGGED(登录状态true)。 - 将
member写入$GLOBALS['_STORE']['__App']。
handle — 中间件处理
php
public function handle(\Closure $next)逻辑
- 控制器非
DiscuzXController实例:verifyToken(false)校验令牌,成功后login(),返回$next()。 - 控制器为
DiscuzXController实例:- 非同源请求:
verifyToken(false)校验令牌。 - AJAX 且非同源:
login();否则用getglobal("uid")获取会员写入member。 - 控制器
$Admin存在 →verify("admin")+$controller->verifyAdmin()。 - 否则控制器
$Auth存在 →verify("auth")+$controller->verifyAuth()。 - 两者都未启用 →
verifyToken(false)。 - 校验失败返回错误
Result。
- 非同源请求:
- 通过后返回
$next()。
使用
php
// 作为全局中间件注册
$app->set([
"middleware" => (new Middleware)->set(GlobalDiscuzXAuthMiddleware::class)
]);