.
This commit is contained in:
@@ -8,7 +8,9 @@ use App\Models\Permission;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Setting;
|
||||
use App\Services\AdminPageAccess;
|
||||
use App\Services\SmsBilling\SmsWalletService;
|
||||
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
|
||||
|
||||
class UserController extends SuperController
|
||||
{
|
||||
@@ -25,6 +27,41 @@ class UserController extends SuperController
|
||||
}
|
||||
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$this->applyPageAccessInput($request, true);
|
||||
return parent::store($request);
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$this->applyPageAccessInput($request, false);
|
||||
return parent::update($request, $id);
|
||||
}
|
||||
|
||||
private function applyPageAccessInput(Request $request, bool $creating): void
|
||||
{
|
||||
$actor = auth('user')->user();
|
||||
if (!$actor instanceof User || !AdminPageAccess::hasFullAccess($actor)) {
|
||||
if ($creating && $actor instanceof User) {
|
||||
$request->merge(['page_access' => $actor->page_access]);
|
||||
} else {
|
||||
$request->replace($request->except('page_access'));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$request->exists('page_access')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$normalized = AdminPageAccess::normalize($request->input('page_access'));
|
||||
if (is_array($normalized) && !AdminPageAccess::hasAnyView($normalized)) {
|
||||
throw new UnprocessableEntityHttpException('حداقل مشاهدهٔ یک صفحه را انتخاب کنید');
|
||||
}
|
||||
$request->merge(['page_access' => $normalized]);
|
||||
}
|
||||
|
||||
public function me(){
|
||||
$user = User::with($this->with)
|
||||
->select($this->select)
|
||||
|
||||
@@ -71,5 +71,6 @@ class Kernel extends HttpKernel
|
||||
'sms.panel.super' => \App\Http\Middleware\EnsureSmsPanelSuperAdmin::class,
|
||||
'customer.active' => \App\Http\Middleware\EnsureCustomerIsActive::class,
|
||||
'superadmin.remote' => \App\Http\Middleware\EnsureSuperAdminRemoteToken::class,
|
||||
'admin.page' => \App\Http\Middleware\EnsureAdminPageAccess::class,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Services\AdminPageAccess;
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class EnsureAdminPageAccess
|
||||
{
|
||||
public function handle(Request $request, Closure $next)
|
||||
{
|
||||
$user = auth('user')->user();
|
||||
if (!$user || AdminPageAccess::hasFullAccess($user)) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
$path = strtolower(trim($request->path(), '/'));
|
||||
if (str_starts_with($path, 'admin/')) {
|
||||
$path = substr($path, strlen('admin/'));
|
||||
}
|
||||
if ($path === 'me' || $path === 'me/update') {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
$method = strtoupper($request->method());
|
||||
$action = null;
|
||||
if (in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) {
|
||||
if (preg_match('#/active(/|$)#', $path)) {
|
||||
$action = 'edit';
|
||||
}
|
||||
} elseif ($method === 'DELETE') {
|
||||
$action = 'delete';
|
||||
} elseif (in_array($method, ['PUT', 'PATCH'], true)) {
|
||||
$action = 'edit';
|
||||
} elseif ($method === 'POST' && !AdminPageAccess::isReadPost($path)) {
|
||||
$action = 'edit';
|
||||
}
|
||||
|
||||
if ($action === null) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
$page = (string) $request->header('X-Admin-Page', '');
|
||||
if ($page === '' || !AdminPageAccess::allows($user, $page, $action)) {
|
||||
$message = $action === 'delete'
|
||||
? 'شما مجوز حذف در این صفحه را ندارید'
|
||||
: 'شما مجوز ویرایش در این صفحه را ندارید';
|
||||
return response()->json(['message' => $message], 403);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user