51 lines
1.4 KiB
PHP
51 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
|
|
class PermMapper
|
|
{
|
|
/** HTTP 메서드 → 액션 버킷 */
|
|
private array $actionMap = [
|
|
'GET' => 'view',
|
|
'HEAD' => 'view',
|
|
'POST' => 'create',
|
|
'PUT' => 'update',
|
|
'PATCH' => 'update',
|
|
'DELETE' => 'delete',
|
|
];
|
|
|
|
public function handle(Request $request, Closure $next)
|
|
{
|
|
$route = $request->route();
|
|
if (! $route) {
|
|
return $next($request);
|
|
}
|
|
|
|
// 1) 이미 perm이 attributes에 있으면 존중
|
|
if ($request->attributes->get('perm')) {
|
|
return $next($request);
|
|
}
|
|
|
|
// 2) 라우트 defaults로 강제 지정된 perm/permission 우선
|
|
$forced = $route->defaults['perm'] ?? $route->defaults['permission'] ?? null;
|
|
if ($forced) {
|
|
$request->attributes->set('perm', $forced);
|
|
|
|
return $next($request);
|
|
}
|
|
|
|
// 3) menu_id 가 지정된 경우: HTTP 메서드 → 액션으로 perm 생성
|
|
$menuId = $route->defaults['menu_id'] ?? null;
|
|
if ($menuId) {
|
|
$action = $this->actionMap[$request->method()] ?? 'view';
|
|
$request->attributes->set('perm', "menu:{$menuId}.{$action}");
|
|
}
|
|
|
|
// 4) menu_id/perm 둘 다 없으면 설정 안 함(체크 미들웨어 정책에 따름)
|
|
return $next($request);
|
|
}
|
|
}
|