347 lines
14 KiB
PHP
347 lines
14 KiB
PHP
<?php
|
|||
|
|
declare(strict_types=1);
|
||
|
|
/**
|
||
|
|
*+------------------
|
||
|
|
* madong
|
||
|
|
*+------------------
|
||
|
|
* Copyright (c) https://gitee.com/motion-code All rights reserved.
|
||
|
|
*+------------------
|
||
|
|
* Author: Mr. April (405784684@qq.com)
|
||
|
|
*+------------------
|
||
|
|
* Official Website: http://www.madong.tech
|
||
|
|
*/
|
||
|
|
|
||
|
|
namespace app\adminapi\controller\system;
|
||
|
|
|
||
|
|
use app\adminapi\controller\Crud;
|
||
|
|
use app\adminapi\CurrentUser;
|
||
|
|
use app\adminapi\event\MenuFormattingEvent;
|
||
|
|
use app\adminapi\middleware\AccessTokenMiddleware;
|
||
|
|
use app\adminapi\middleware\OperationMiddleware;
|
||
|
|
use support\Container;
|
||
|
|
use app\adminapi\middleware\PermissionMiddleware;
|
||
|
|
use app\adminapi\validate\system\AuthValidate;
|
||
|
|
use app\service\admin\system\AdminRoleService;
|
||
|
|
use app\service\admin\system\AdminService;
|
||
|
|
use app\service\admin\system\AuthService;
|
||
|
|
use app\service\admin\system\MenuService;
|
||
|
|
use app\service\admin\system\RoleMenuService;
|
||
|
|
use app\service\admin\system\RoleScopeDeptService;
|
||
|
|
use app\service\admin\system\RoleService;
|
||
|
|
use madong\swagger\attribute\AllowAnonymous;
|
||
|
|
use madong\swagger\attribute\Permission;
|
||
|
|
use core\exception\handler\UnauthorizedHttpException;
|
||
|
|
use core\jwt\JwtToken;
|
||
|
|
use core\tool\Json;
|
||
|
|
use madong\helper\Dict;
|
||
|
|
use madong\swagger\annotation\response\SimpleResponse;
|
||
|
|
use OpenApi\Attributes as OA;
|
||
|
|
use support\Request;
|
||
|
|
use support\annotation\Middleware;
|
||
|
|
use Webman\Event\Event;
|
||
|
|
|
||
|
|
#[Middleware(AccessTokenMiddleware::class, PermissionMiddleware::class, OperationMiddleware::class)]
|
||
|
|
final class AuthController extends Crud
|
||
|
|
{
|
||
|
|
public function __construct(AuthService $service, AuthValidate $validate)
|
||
|
|
{
|
||
|
|
$this->service = $service;
|
||
|
|
$this->validate = $validate;
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Get(
|
||
|
|
path: '/system/auth/user-info',
|
||
|
|
summary: '获取登录用户',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:user_info')]
|
||
|
|
#[AllowAnonymous(requireToken: true, requirePermission: false)]
|
||
|
|
#[SimpleResponse(example: '{"code": 0,"msg": "ok","data": {"id": "1","user_name": "admin","real_name": "超级管理员","nick_name": "超级管理员","is_super": 1,"mobile_phone": null,"email": null,"avatar": null,"signed": null,"dashboard": null,"dept_id": "","enabled": 1,"login_ip": "127.0.0.1","login_time": 1762429533,"created_by": null,"updated_by": null,"created_at": "2025-10-30T12:24:09.000000Z","updated_at": "2025-11-06T11:45:34.000000Z","deleted_at": null,"sex": 0,"remark": null,"birthday": null,"tel": null,"is_locked": 0,"role_id_list": [],"post_id_list": [],"created_date": "2025-10-30 20:24:09","updated_date": "2025-11-06 19:45:34","depts": [],"posts": [],"casbin": [],"roles": []}}')]
|
||
|
|
public function getUserInfo(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
/** @var CurrentUser $currentUser */
|
||
|
|
$currentUser = Container::make(CurrentUser::class);
|
||
|
|
$data = $currentUser->admin(true);
|
||
|
|
if (empty($data)) {
|
||
|
|
throw new UnauthorizedHttpException('用户凭证失效请重新登录');
|
||
|
|
}
|
||
|
|
return Json::success('ok', $data);
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), null, 401);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Get(
|
||
|
|
path: '/system/auth/user-menus',
|
||
|
|
summary: '获取用户-权限菜单',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:user_menus')]
|
||
|
|
#[AllowAnonymous(requireToken: true, requirePermission: false)]
|
||
|
|
#[SimpleResponse(schema: [], example: [])]
|
||
|
|
public function getPermissionsMenu(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
$format = input('format', 'default');
|
||
|
|
/** @var CurrentUser $currUser */
|
||
|
|
$currUser = Container::make(CurrentUser::class);
|
||
|
|
$collection = $this->service->getMenusByUserRoles($currUser, true);
|
||
|
|
$event = new MenuFormattingEvent($collection, $format);
|
||
|
|
$data = $event->dispatch();
|
||
|
|
return Json::success('ok', $data);
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Get(
|
||
|
|
path: '/system/auth/user-permissions',
|
||
|
|
summary: '权限菜单-包含所有 菜单 按钮 接口',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:user_permissions')]
|
||
|
|
#[SimpleResponse(example: '{"code": 0,"msg": "ok","data": []}')]
|
||
|
|
public function getPermissions(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
$format = input('format', 'default');
|
||
|
|
/** @var CurrentUser $currUser */
|
||
|
|
$currUser = Container::make(CurrentUser::class);
|
||
|
|
$collection = $this->service->getMenusByUserRoles($currUser, true);
|
||
|
|
$event = new MenuFormattingEvent($collection, $format);
|
||
|
|
$data = $event->dispatch();
|
||
|
|
return Json::success('ok', $data);
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Get(
|
||
|
|
path: '/system/auth/perm-code',
|
||
|
|
summary: '获取用户-权限码',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:perm_code')]
|
||
|
|
#[AllowAnonymous(requireToken: true, requirePermission: false)]
|
||
|
|
#[SimpleResponse(example: '{"code": 0,"msg": "ok","data": ["admin"]}')]
|
||
|
|
public function getUserCodes(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
/** @var CurrentUser $currUser */
|
||
|
|
$currUser = Container::make(CurrentUser::class);
|
||
|
|
$data = $this->service->getCodesByUserRoles($currUser);
|
||
|
|
return Json::success('ok', $data);
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Get(
|
||
|
|
path: '/system/auth/role-menu-ids',
|
||
|
|
summary: '通过角色ID获取权限ID集合',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:role_menu_ids')]
|
||
|
|
#[SimpleResponse(example: ['code' => 0, 'message' => 'success', 'data' => []])]
|
||
|
|
public function roleMenuIds(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
$roleId = $request->input('role_id');
|
||
|
|
/** @var RoleService $systemRoleService */
|
||
|
|
$systemRoleService = Container::make(RoleService::class);
|
||
|
|
$data = $systemRoleService->getPermissionColumns($roleId);
|
||
|
|
return Json::success('ok', $data);
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Get(
|
||
|
|
path: '/system/auth/role-scope-ids',
|
||
|
|
summary: '通过角色ID获取权限范围自定义部门ID集合',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:role_scope_ids')]
|
||
|
|
#[SimpleResponse(example: ['code' => 0, 'message' => 'success', 'data' => []])]
|
||
|
|
public function roleScopeIds(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
$roleId = $request->input('role_id');
|
||
|
|
/** @var RoleScopeDeptService $systemRoleMenuService */
|
||
|
|
$systemRoleMenuService = Container::make(RoleScopeDeptService::class);
|
||
|
|
$data = $systemRoleMenuService->getColumn(['role_id' => $roleId], 'dept_id');
|
||
|
|
return Json::success('ok', $data);
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Post(
|
||
|
|
path: '/system/auth/save-role-menu',
|
||
|
|
summary: '保存角色菜单关系',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:role_menu')]
|
||
|
|
#[SimpleResponse(schema: [], example: [])]
|
||
|
|
public function saveRoleMenuRelation(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
$data = $request->all();
|
||
|
|
/** @var RoleMenuService $systemRoleMenuService */
|
||
|
|
$systemRoleMenuService = Container::make(RoleMenuService::class);
|
||
|
|
$systemRoleMenuService->save($data);
|
||
|
|
return Json::success('success');
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Get(
|
||
|
|
path: '/system/auth/user-list-by-role-id',
|
||
|
|
summary: '获取角色-关联用户列表',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[OA\Parameter(
|
||
|
|
name: 'role_id',
|
||
|
|
description: '角色ID',
|
||
|
|
in: 'query',
|
||
|
|
required: true,
|
||
|
|
schema: new OA\Schema(type: 'string'),
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:role_user_list')]
|
||
|
|
#[SimpleResponse(example: ['code' => 0, 'message' => 'success', 'data' => []])]
|
||
|
|
public function getUsersByRoleId(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
[$where, $format, $limit, $field, $order, $page] = $this->selectInput($request, [
|
||
|
|
'exclude_filters' => true,
|
||
|
|
'filter_format' => 'simple', // 简洁模式没有操作符
|
||
|
|
'custom_fields' => [
|
||
|
|
'user_name',
|
||
|
|
'real_name',
|
||
|
|
'mobile_phone',
|
||
|
|
'role_id',
|
||
|
|
],
|
||
|
|
]);
|
||
|
|
/** @var AdminService $systemUserService */
|
||
|
|
$systemUserService = Container::make(AdminService::class);
|
||
|
|
$data = $systemUserService->getUsersListByRoleId($where, $field, $page, $limit);
|
||
|
|
return Json::success('ok', $data);
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Post(
|
||
|
|
path: '/system/auth/save-user-role',
|
||
|
|
summary: '保存用户-关联角色',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:save_user_role')]
|
||
|
|
#[SimpleResponse(example: '{"code": 0,"msg": "success"}')]
|
||
|
|
public function saveUserRoles(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
$data = $request->all();
|
||
|
|
/** @var AdminRoleService $systemUserRoleService */
|
||
|
|
$systemUserRoleService = Container::make(AdminRoleService::class);
|
||
|
|
$systemUserRoleService->saveUserRoles($data);
|
||
|
|
return Json::success('success');
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Post(
|
||
|
|
path: '/system/auth/remove-user-role',
|
||
|
|
summary: '移除用户-关联角色',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:remove_user_role')]
|
||
|
|
#[SimpleResponse(example: '{"code": 0,"msg": "ok"}')]
|
||
|
|
public function removeUserRole(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
$data = $request->all();
|
||
|
|
/** @var AdminRoleService $systemUserRoleService */
|
||
|
|
$systemUserRoleService = Container::make(AdminRoleService::class);
|
||
|
|
$systemUserRoleService->removeUserRole($data);
|
||
|
|
return Json::success('ok');
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[OA\Get(
|
||
|
|
path: '/system/auth/user-list-exclude-role-id',
|
||
|
|
summary: '获取用户列表-排除指定角色id',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[OA\Parameter(
|
||
|
|
name: 'role_id',
|
||
|
|
description: '角色ID',
|
||
|
|
in: 'query',
|
||
|
|
required: true,
|
||
|
|
schema: new OA\Schema(type: 'string'),
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:user_list_exclude_role')]
|
||
|
|
#[SimpleResponse(example: ['code' => 0, 'message' => 'success', 'data' => []])]
|
||
|
|
public function getUsersExcludingRole(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
try {
|
||
|
|
[$where, $format, $limit, $field, $order, $page] = $this->selectInput($request, [
|
||
|
|
'exclude_filters' => true,
|
||
|
|
'filter_format' => 'simple', // 简洁模式没有操作符
|
||
|
|
'custom_fields' => [
|
||
|
|
'LIKE_user_name',
|
||
|
|
'LIKE_real_name',
|
||
|
|
'LIKE_mobile_phone',
|
||
|
|
'role_id',
|
||
|
|
]]);
|
||
|
|
$systemUserService = Container::make(AdminService::class);
|
||
|
|
$data = $systemUserService->getUsersExcludingRole($where, $field, $page, $limit);
|
||
|
|
return Json::success('ok', $data);
|
||
|
|
} catch (\Throwable $e) {
|
||
|
|
return Json::fail($e->getMessage(), [], $e->getCode());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @throws \core\jwt\ex\JwtRefreshTokenExpiredException
|
||
|
|
*/
|
||
|
|
#[OA\Post(
|
||
|
|
path: '/system/auth/refresh-token',
|
||
|
|
summary: '刷新Token',
|
||
|
|
security: [['Bearer' => [], 'ApiKey' => []]],
|
||
|
|
tags: ['权限相关'],
|
||
|
|
)]
|
||
|
|
#[Permission(code: 'system:auth:refresh_token')]
|
||
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false)]
|
||
|
|
#[SimpleResponse(example: '{"data": "new_access_token"}')]
|
||
|
|
public function refreshToken(Request $request): \support\Response
|
||
|
|
{
|
||
|
|
$token = (new JwtToken())->refresh();
|
||
|
|
return Json::success('ok', [
|
||
|
|
'access_token' => $token->accessToken,
|
||
|
|
'refresh_token' => $token->refreshToken,
|
||
|
|
'expires_in' => $token->expiresIn,
|
||
|
|
'expires_at' => $token->expiresAt->getTimestamp(),
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|