sessionGuard()->check(); if (!$result->authenticated || $result->userId === null || $result->roleId === null) { return Response::make('', 302, ['Location' => '/login']); } if ($permission !== null && !$this->authorizer()->can($result->roleId, $permission)) { return $this->adminView('admin/forbidden', ['title' => 'Acces refuse', 'activeNav' => ''], $result, 403); } return $result; } /** * Rend une vue dans le shell admin en injectant le contexte commun * (nom/role de l'utilisateur, permissions pour la navigation, jeton CSRF). * Les cles passees dans $data ont priorite (ex. activeNav). * * @param array $data */ protected function adminView(string $name, array $data, GuardResult $guard, int $status = 200): Response { $userId = $guard->userId ?? 0; $roleId = $guard->roleId ?? 0; $info = $this->userDirectory()->displayInfo($userId); $context = [ 'currentUserName' => $info['name'], 'currentUserRole' => $info['role_label'], 'currentUserEmail' => $info['email'], 'permissions' => $this->authorizer()->permissionsFor($roleId), 'csrfToken' => Csrf::token($this->sessionManager()), 'activeNav' => '', 'flash' => $this->takeFlash(), ]; return $this->view($name, $data + $context, $status); } protected function userDirectory(): UserDirectory { return new UserDirectory($this->db()); } /** * Message de confirmation a afficher apres une redirection (pose avant le 302, * consomme au rendu suivant). Stocke en session pour survivre a la redirection. */ protected function setFlash(string $message): void { $this->sessionManager()->set('_flash', $message); } private function takeFlash(): ?string { $flash = $this->sessionManager()->get('_flash'); if ($flash === null) { return null; } $this->sessionManager()->set('_flash', null); return is_string($flash) ? $flash : null; } }