From 9174f99971585a5061fe990541e20ff036e11cce Mon Sep 17 00:00:00 2001 From: vasya Date: Fri, 13 Mar 2026 19:52:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=BE=D1=81=D1=80=D0=B5=D0=B4=D0=BD=D0=B8=D0=BA?= =?UTF-8?q?=20=D0=B0=D1=83=D1=82=D0=B5=D0=BD=D1=82=D0=B8=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8,=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B9=20=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B2=D1=81=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D1=8B=20web=20=D0=BA=D0=BE=D0=BD=D1=82=D1=83=D1=80?= =?UTF-8?q?=D0=B0=20(=D0=BD=D1=83=20=D0=BA=D1=80=D0=BE=D0=BC=D0=B5=20?= =?UTF-8?q?=D1=82=D0=B5=D1=85,=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D1=85=20=D0=BC=D1=8B=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=88=D0=B5=D0=BC=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20web.php)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Middleware/AuthenticateMagic.php | 73 +++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/app/Http/Middleware/AuthenticateMagic.php b/app/Http/Middleware/AuthenticateMagic.php index e69de29..bff4767 100644 --- a/app/Http/Middleware/AuthenticateMagic.php +++ b/app/Http/Middleware/AuthenticateMagic.php @@ -0,0 +1,73 @@ +isStarted()) { + if (session()->has('_auth_login')) { + //гаврилов. получение токена + // $token = $request->user(); + // $userId = User::where('login', $token->getAttributes()['samaccountname'][0])->get()->toArray()[0]['id']; + // $tokenExpires = PersonalAccessToken::where('tokenable_id', $userId)->get()->toArray()[0]['expires_at']; + // echo '
'; var_dump(new \DateTime($tokenExpires)); echo'
'; + // echo '
'; var_dump(PersonalAccessToken::where('tokenable_id', $userId)->get()->toArray()[0]['expires_at']); echo'
'; + //Если токен истекает менее через 60 минут, продлеваем его на 2 часа. Ситуации, что сессия протухла, а токен продолжает жить не может случиться, так как апи запросы с фронта отправляют куку аутентификации, которая проверяется при $this->authenticate. Если она протухла, возвратится 401 ошибку. + // if ($token->expires_at->diffInMinutes(now()) < 60) { + // $token->update( + // [ + // 'expires_at' => now()->addHours(2) + // ] + // ); + // } + + //Через фасад устанавливаем все значения аутентифицированного пользователя, чтобы через этот же фасад можно было и любого места в приложении их получить. + UserContext::setUserLogin(session()->get('_auth_login')); + $userGroups = session()->get('_auth_groups'); + UserContext::setUserADGroups($userGroups); + UserContext::setUserEmails($userGroups); + UserContext::setIsAdminFlag(session()->get('is_admin')); + //На этапе посредника мы не проводим повторное определение ролей пользователя, это было сделано в LoginController в процессе авторизации после успешной аутентификации. Здесь мы уже берем его доступы из таблицы с токенами + $user = User::where('login', UserContext::getUserLogin())->first(); + UserContext::setUserId($user->id); + UserContext::setUserAppPermissions($user->tokens()->latest()->first()->abilities['permissions']); + #Гаврилов + return $next($request); + } else { + //Получаем адрес предыдущей страницы, на которую хотел попасть пользователь, чтобы направить его после успешной аутентификации на этот адрес + $prevPageUrl = explode('/', $_SERVER['REDIRECT_URL']); + //Удаляем из URL редиректа пустые сегменты и сегмент с названием приложения (оно подставляется при редиректе само) + unset($prevPageUrl[0], $prevPageUrl[1]); + //Кладем в сессию адрес страницы. только если это не страница выхода, иначе после аутентификации пользователя сразу выбросит + session()->put('_auth_prev_page', implode('/', $prevPageUrl) == 'logout' ? '/menu' : implode('/', $prevPageUrl)); + return redirect('/login'); + //редирект на страницу login с сообщением об ошибке + } + } else { + return redirect('/login'); + //redirect на страницу login после которой точно сессия застартует, так как это webроут, а не api + } + // return $next($request); + } +}