| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- <?php
- namespace Tests\Integration;
- use App\Http\Middleware\OperationsAdminMiddleware;
- use Illuminate\Config\Repository;
- use Illuminate\Database\Capsule\Manager;
- use Illuminate\Events\Dispatcher;
- use Illuminate\Foundation\Application;
- use Illuminate\Http\Request;
- use Illuminate\Routing\Route;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Facade;
- use PHPUnit\Framework\TestCase;
- /** 运营配置类接口只看超级管理员和数据库角色授权,不读环境变量白名单。 */
- class OperationsAdminAccessTest extends TestCase
- {
- protected function setUp(): void
- {
- Facade::clearResolvedInstances(); $app = new Application(dirname(__DIR__, 2));
- $app->instance('config', new Repository(['operations' => ['admin_ids' => [1, 9]]]));
- Facade::setFacadeApplication($app);
- $db = new Manager($app); $db->addConnection(['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => 'bot_']);
- $db->setEventDispatcher(new Dispatcher($app)); $db->setAsGlobal(); $db->bootEloquent();
- $app->instance('db', $db->getDatabaseManager());
- $app->instance(\Illuminate\Contracts\Routing\ResponseFactory::class, new \Tests\Support\JsonResponseFactory());
- DB::statement('CREATE TABLE bot_menus (id INTEGER PRIMARY KEY, uri TEXT, type INTEGER, status INTEGER)');
- DB::statement('CREATE TABLE bot_role_menu (role_id INTEGER, menu_id INTEGER)');
- DB::statement('CREATE TABLE bot_role_user (role_id INTEGER, user_id INTEGER)');
- DB::table('menus')->insert([
- ['id' => 1, 'uri' => 'maintenance', 'type' => 1, 'status' => 1], ['id' => 2, 'uri' => 'admin/maintenance', 'type' => 2, 'status' => 1],
- ['id' => 3, 'uri' => 'admin/maintenance/submit', 'type' => 2, 'status' => 0],
- ]);
- // 角色 10:只有页面菜单;11:维护列表按钮;12:保存按钮(隐藏状态也算授权)
- DB::table('role_menu')->insert([['role_id' => 10, 'menu_id' => 1], ['role_id' => 11, 'menu_id' => 2], ['role_id' => 12, 'menu_id' => 3]]);
- DB::table('role_user')->insert([['role_id' => 10, 'user_id' => 2], ['role_id' => 11, 'user_id' => 3], ['role_id' => 12, 'user_id' => 4], ['role_id' => 11, 'user_id' => 4]]);
- }
- protected function tearDown(): void { DB::disconnect(); Facade::clearResolvedInstances(); parent::tearDown(); }
- private function call(int $adminId, string $uri, ?string $permissionUri = null)
- {
- $request = Request::create('/' . $uri); $request->user = (object) ['id' => $adminId];
- $route = new Route('GET', $uri, []);
- if ($permissionUri !== null) $route->defaults('permission_uri', $permissionUri);
- $request->setRouteResolver(fn () => $route);
- $result = (new OperationsAdminMiddleware())->handle($request, static fn () => 'passed');
- return $result === 'passed' ? $result : $result->getData(true)['msg'];
- }
- public function test_super_admin_or_role_with_the_route_button_passes(): void
- {
- $this->assertSame('passed', $this->call(1, 'admin/maintenance'));
- $this->assertSame('无运营配置管理权限', $this->call(9, 'admin/maintenance'), '不再读 OPERATIONS_ADMIN_IDS');
- $this->assertSame('无运营配置管理权限', $this->call(0, 'admin/maintenance'));
- $this->assertSame('无运营配置管理权限', $this->call(2, 'admin/maintenance'), '只勾页面菜单不够,要勾接口按钮');
- $this->assertSame('passed', $this->call(3, 'admin/maintenance'));
- $this->assertSame('passed', $this->call(3, 'admin/maintenance/detail', 'admin/maintenance'), 'permission_uri 复用列表按钮');
- $this->assertSame('无运营配置管理权限', $this->call(3, 'admin/maintenance/submit'));
- $this->assertSame('passed', $this->call(4, 'admin/maintenance/submit'));
- $this->assertSame('passed', $this->call(3, 'admin/maintenance/logs'), '按钮没建时跟随同模块授权');
- $this->assertSame('无运营配置管理权限', $this->call(2, 'admin/maintenance/logs'), '只有前端页面菜单不算模块授权');
- $this->assertSame('无运营配置管理权限', $this->call(3, 'admin/paymentConfig/direct/save'), '其他模块没有授权');
- $this->assertSame('无运营配置管理权限', $this->call(3, 'admin/maintenanceX/logs'), '前缀相似但不是同一模块');
- DB::table('role_menu')->where('role_id', 11)->delete();
- $this->assertSame('无运营配置管理权限', $this->call(3, 'admin/maintenance'), '取消勾选后立即失效');
- }
- }
|