Files
2026-07-22 10:18:59 +08:00

61 lines
1.9 KiB
PHP

<?php
namespace app\middleware;
use app\model\User;
use app\service\JwtService;
use think\exception\HttpResponseException;
use think\Response;
class JwtAuth
{
public function handle($request, \Closure $next)
{
$token = $request->header('Authorization', '');
$payload = JwtService::verifyToken($token);
if (!$payload || empty($payload['user_id'])) {
$this->abort('请先登录', 401);
}
$user = User::with(['membership'])->find($payload['user_id']);
if (!$user || $user->status !== 'active') {
$this->abort('请先登录', 401);
}
$request->authUser = $this->formatUser($user);
return $next($request);
}
private function formatUser(User $user): array
{
$level = $user->membership;
return [
'id' => $user->id,
'username' => $user->username,
'email' => $user->email,
'nickname' => $user->nickname,
'avatar' => $user->avatar,
'role' => $user->role,
'status' => $user->status,
'membership_level_id' => $user->membership_level_id,
'membership_name' => $level?->name,
'membership_slug' => $level?->slug,
'max_conversations' => $level?->max_conversations ?? 20,
'max_messages_per_day' => $level?->max_messages_per_day ?? 50,
'max_upload_size_mb' => $level?->max_upload_size_mb ?? 5,
'membership_permissions' => $level?->permissions ?? [],
];
}
private function abort(string $message, int $httpCode = 400): void
{
throw new HttpResponseException(json([
'code' => 1,
'message' => $message,
'data' => null,
], $httpCode));
}
}