Как логически правильно организовать контроль авторизованного?
Ну установил я сессию и проверяю, есть ли она, подгружаю разный шаблон туда по условию, вынес в общий контроллер от него остальные наследуются.
Ну и нахожусь я в каком-то контроллере, и сессия умерла и шаблон изменился, но вьюха-то осталась))) Мне же нужно на начальную редирект какой-то, а если закрыл браузер и открываю по начальной и авторизован, то мне же на сайт редирект нужно с неё тоже )
Пока что придумал в общем контроллере (чтобы в каждом контроллере не чекать сессию) проверять сессию и соответствует ли текущий контроллер наличию сессии.
Кто-то может подскажет простой материал по удержанию авторизованного? На ООП.
Каждый запрос авторизованного к любой странице - проверяйте присланные куки (id сессии и токен авторизации) и продляйте их. Тогда сессия не умрёт внезапно посреди исполнения скрипта и проблема исчезнет.
ну и тогда разавторизовался юзер сам ну и сделал я ему редирект после разавторизации на главную, ну и юзер взял и ввёл в браузере адрес страницы для авторизованного и попал на неё не авторизовавшись ))) его же нужно удерживать на главной, если он не авторизован - мне контроль авторизованного нужен а не жизни сессии)
xmoonlight, удалил юзера из БД, юзера нет, сессия есть, нужно же проверить есть ли данные на юзера, если нет, то убить сессию и сделать редирект, проверки наличия сессии как бы мало :(
bedolazhka, "удалил юзера из БД" - это уже нестандартное поведение.
Проверяйте тогда каждый раз базу: удалили вы его там вручную или нет.
Обычно, при удалении, удаляется токен сессии. А токен доступа - передаётся в куках.
Несовпадение токена в базе и в куках - завершение сессии.
В общем, много тут нюансов.
bedolazhka, добавить рядом ещё, что он залогинен или нет: $session_online и проверить на true или false. Тогда не придётся лазить в базу, если он не залогинен.
xmoonlight, ну то что он залогинен я проверил, теперь мне нужно, если он на главной то редиректить в область залогиненных, как проверить, что он на главной? По имени контроллера? Или мне в каждый контроллер писать проверку, что разлогинился и редиректить на главную и наоборот? Я хочу в общем контроллере делать проверку, такая подойдёт?
public function __construct($route)
{
parent::__construct($route);
if ($this->checkAuth($_SESSION['uid'] ?? null)) {
$this->authRedirect($this->controller);
$this->layout = 'auth';
} else {
$this->noAuthRedirect($this->controller);
$this->layout = 'noauth';
}
}
private function checkAuth($session_uid)
{
if (isset($session_uid)) {
$this->user = $this->mObj->getUser($session_uid);
if (is_object($this->user)) {
return true;
}
session_unset();
}
return false;
}
protected function redirect($http = null)
{
if (is_null($http)) {
$redirect = $_SERVER['HTTP_REFERER'] ?? '/';
} else {
$redirect = $http;
}
header('location: ' . $redirect);
exit();
}
protected function alertRedirect($result, $text, $http = null)
{
$_SESSION['alert'] = [
'result' => $result,
'text' => $text
];
$this->redirect($http);
}
private function authRedirect($controller)
{
if ($controller == 'Start') {
$this->alertRedirect('success', 'Добро пожаловать', '/menu');
}
}
private function noAuthRedirect($controller)
{
if ($controller != 'Start') {
$this->alertRedirect('danger', 'Всего доброго', '/');
}
}
bedolazhka, ну в общем и надо делать, при запросе же однократно вызывается общий - значит так правильно. Главное - не запутаться в редиректах и зависимостях.
xmoonlight,
- abstract Controller - базовый
-- abstract AppController extends Controller - контроллер приложения (тут проверка авторизованного и свои какие-то общие методы по мелочам)
--- все остальные контроллеры extends AppController
bedolazhka, ну т.е. дерево - понятно.
А я делаю "плоский гамбургер" и до тех пор, пока не пройдёт все проверки (проверка входных данных, сессия, юзер, взятие роутер-сегментов и т.д.), вообще не заходит в основной app.
Ну и как только что-то невалидно - сразу ныряем в app и там рендерим красивую страницу.