@karasique

Нормально ли так проверять авторизацию?

Сейчас я проверяю через функцию, есть ли куки. Сравниваю их с данными в базе и принимаю решение.
Если в __construct прописать условие проверки $_COOKIE['id'] на пустоту, то можно убрать как минимум одно условие которое растянуто на всю страницу if (){тело страницы}else{header location}.
class worker extends user {
    public $workerData;
    function __construct()
    {
        if (is_empty($_COOKIE['id'])){
            header("Location: {x/auth");
            exit;
        }
       return $this->workerData = user::getDataFromDB('id',$_COOKIE['id'],'*','staff');
    }
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
SerafimArts
@SerafimArts
Senior Notepad Reader
Всё печально. Давай по-порядку:

Одной из ключевых задач ООП является абстракция, что требует декомпозиции кода. Следовательно, первым шагом для причёсывания кода будет:
class Worker extends User // <- Не стоит забывать о PSR
{
    public function __construct(array $data)
    {
        if (empty($data)) {
            header(....);
            exit;
        }

        // В конструкторе нет ретурна, так что это ошибка
    }
}


Шаг 1 Результат: Мы отвязались от кукисов и можем эту же логику переиспользовать вообще с чем угодно.

Теперь мы больше не связаны с окружением (ещё header надо убрать) и имеем код, позволяющий переиспользовать себя в различных ситуациях:
$worker = new Worker($_COOKIE);

Ну и так далее.

При этом есть фатальные косяки (отвечая на твой вопрос "Нормально ли так проверять авторизацию"): Что если я возьму, открою консоль в браузере и заменю кукис id=1 на id=42?

Решаем эту проблему:
$worker = new Worker($_SESSION);

Вот и пригодились все "улучшения", которые мы произвели ранее. Для решения проблемы нам понадобилось лишь заменить источник данных (т.е. массив) из кукисов на сессии. Этот процесс передачи данных извне называется "делегированием".

Помимо этого - сам процесс входа в систему называется "аутентификацией", а не "авторизацией". Авторизация - это процесс проверки прав доступа к какому-то функционалу.

Результат не идеален и содержит ещё кучку проблем, но с фатальными мы вроде разобрались.

Твоя задача далее, разу уж ты поставил тег "ООП" - смотреть на код, который ты написал и попробовать его перенести в другие условия. Если он там уже работать не будет без изменений его внутренностей - значит в коде есть набор косяков. Пример:
1) Можно ли использовать твой код, получая данные не из БД, а из файлов?
2) Можно ли создать нового "рабочего" не передавая туда ID, чтобы он сгенерировался сам на основе, например, auto increment поля в БД?
3) Можно ли добавить условия в запрос к БД (например, что "рабочий" не забанен)?
4) и т.д.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы