hyperf/app/Middleware/PermissionMiddleware.php

85 lines
2.2 KiB
PHP
Executable File

<?php
declare(strict_types=1);
/**
* This file is part of the youyao/admin-api.
*
* (c) youyao <info@nuancebiotech.cn>
* This source file is subject to the license under the project that is bundled.
*/
namespace App\Middleware;
# 生成才能被自动注册
# composer dumpautoload 执行加载 不行在执行
# 生成中间件 php ./bin/hyperf.php gen:middleware Auth/FooMiddleware 【Auth = 文件夹名称-可以不带 默默人会生成在 app下的Middleware
# 文件夹中,若没有自动创建 /FooMiddleware = 中间价名称】
use App\Constants\AppErr;
use App\Exception\BusinessException;
use App\Kernel\Casbin\Casbin;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Hyperf\Config\Annotation\Value;
class PermissionMiddleware implements MiddlewareInterface
{
/**
* @var ContainerInterface
*/
protected $container;
/**
* @var Casbin
*/
private $casbin;
private $exclude = [
'/api/auth/login',
'/api/user',
'/api/user/logout',
'/api/user/menus',
'/api/user/profile',
'/api/user/password',
'/api/user/avatar',
];
public function __construct(ContainerInterface $container)
{
$this->container = $container;
$this->casbin = $container->get(Casbin::class);
}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$path = $request->getUri()->getPath();
if (in_array($path, $this->exclude)) {
return $handler->handle($request);
}
$user = user();
if (! $this->casbin->enforce($user->username, $path, $request->getMethod())) {
logger('casbin-permission')->info(
AppErr::info(AppErr::PERMISSION_DENIED),
[
'user' => $user,
'path' => $path,
'method' => $request->getMethod(),
]
);
throw new BusinessException(null, AppErr::PERMISSION_DENIED);
}
return $handler->handle($request);
}
}