За последние 24 часа нас посетили 107014 программистов и 5648 роботов. Сейчас ищут 2497 программистов ...

Организация ролей в бд.

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 28 сен 2019.

  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.125
    Симпатии:
    1.222
    Адрес:
    там-сям
    Если подумать, то сессия это не кеш. Не надо её использовать не по назначению.
    Вот в кеше хранить политики доступа — богоугодно.
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Получается хранить в сессии rid->admin без полномочий?
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.125
    Симпатии:
    1.222
    Адрес:
    там-сям
    Я считаю достаточно того, что пользователь идентифицирован через сессию. Остальное к сессии не относится.

    И вообще, ты уже добился чтобы всё работало, что взялся за "оптимизацию"? :) Преждевременная оптимизация — зло. Так только отсрачивается результат и появляются ненужные уровни сложности.
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    пока еще не добился то занят то некогда, решил вчера взяться, просто я делаю админку, из-за этого и спрашиваю, когда сохранять сессию админа в начале или после авторизации пользователя)
    А вообще да я еще не добился того чего я хочу)
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.125
    Симпатии:
    1.222
    Адрес:
    там-сям
    Авторизация это разрешение на действие. Похоже ты пытаешся перепрыгнуть через несколько ступеней в своём обучении. Так не получится.

    Нет никакой специальной "сессии админа". Ты же пилишь роли, вроде должен это понимать. Ты идентифицировал пользователя, используй его идентификатор чтобы понять авторизован он на действие или нет. Для этого у тебя есть информация в базе. Тебе незачем иметь в сессии больше чем один только id пользователя.

    id и запрошенное_действие это входящие параметры функции, на выходе должен быть ответ "да, имеет право" или "нет, не имеет". Не отвлекайся на сессии и как много можно в них сохранить. Напиши пошаговый план:

    - реализовать вход по логину и паролю и сохранение идентификатора в сессии или куке. это будет "аутентификация" и "идентификация".

    - проверять залогинен ли пользователь на произвольной странице (пока без ролей), чтобы дать / не дать ему доступ. это назвается "авторизация"

    - проверять есть ли у пользователя разрешение на конкретное действие через таблицы ролей и разрешений. это называется "авторизация на базе ролей"
    каждый пункт можно разбить ещё мельче.
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    если я дошел до админки, это означает что с регистрацией я уже разобрался, а вот дошел до админки возникли вопросы.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.125
    Симпатии:
    1.222
    Адрес:
    там-сям
    Ну тогда ты молодец и помощь тебе не нужна. А то мне кажется что это
    с моей т.з. ересь. Но раздувать флейм и доказывать что у тебя ничего нет я не хочу.
     
    _ne_scaju_ нравится это.
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Спасибо дружище за помощь, сделаю таким образом.
    Описание логики:
    1. При авторизации на сайт мы проверяем всего лишь логин и пароль, при удачной проверке добавляем ID пользователя в сессию и редирект его в ЛК.
    2. Допустим при просмотре закрытой странице проверяем существует ли ID в сессии, если true мы можем сделать запрос на проверку роли и доступности полномочий если проходит все проверки разрешаем ему доступ к защищенной странице.
    3. Доступ к админке можно сделать аналогично с пунктом 2 но при этом мы можем сохранить сессию админа(но не обязательно) т.к. мы проверяем роль и разрешения для ролей
    Вроде как все.
    Теперь такой вопрос, есть к примеру 2 запроса.
    Возвращаем объект(роли) соответствующие полномочия:
    PHP:
    1. $res = $this -> db -> sel("
    2.            SELECT
    3.              `t2`.`perm_desc`
    4.            FROM `permission_role` as `t1`
    5.            JOIN `permissions` as `t2` ON `t1`.`perm_id` = `t2`.`perm_id`
    6.            WHERE `t1`.`role_id` = ?", [ $role_id ], true );
    Наполняем объект roles соответствующими разрешениями:
    PHP:
    1. $res = $this -> db -> sel("
    2.        SELECT
    3.          `t1`.`role_id`, `t2`.`role_name`
    4.        FROM `users_role` as `t1`
    5.        JOIN `roles` as `t2` ON `t1`.`role_id` = `t2`.`role_id`
    6.        WHERE `t1`.`user_id` = ?", [ $uid ], true );
    Стоит ли делать третий запрос допустим, возвращаем роль пользователя?
    PHP:
    1. $this -> db -> sel('
    2.            SELECT
    3.              `roles`.`role_id`, `roles`.`role_name`
    4.            FROM `roles`
    5.            JOIN `users_role` ON `users_role`.`role_id` = `roles`.`role_id`
    6.            JOIN `users` ON `users`.`user_id` = `users_role`.`user_id`
    7.            WHERE `users`.`user_id` = ?', [ (int) $uid ], false );
    Спасибо!
     
    #33 _ne_scaju_, 11 окт 2019
    Последнее редактирование: 11 окт 2019