За последние 24 часа нас посетили 18916 программистов и 1709 роботов. Сейчас ищут 988 программистов ...

делегирование прав доступа

Тема в разделе "PHP для новичков", создана пользователем tesla, 27 апр 2016.

  1. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Всем привет, вопрос тут назрел. Каким образом реализовывается делегирование прав доступа?
    "Костяк" на CI3.

    Пример такой: есть админка, в которой изначально есть три раздела. Довольно тривиальное решение - сделать таблицу для юзеров "не админов" (админ по умолчанию может все):
    user_id, section1, section2,section3
    ну и при занесении пользователя проставлять 1 - есть доступ, 0- нет доступа.

    Каким образом реализовать проверку с последующим хранением результатов? Это должно быть в авторизации, авторизация у меня в конструкторе контроллера admin.

    То есть при авторизации чекать таблицу users_role и хранить всю цепочку [section1=>1, section2=>0,section3=>1] (например) где нибудь в сессиях, а при обращении к контроллеру нужного раздела делать проверку: если 1 - мы попадаем в index если нет - выводить сообщение о недостатке прав или редирект на главную.. или это бред?
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Есть готовые реализации для RBAC и ACL.
     
  3. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Хотелось бы на примере своего велосипеда. Исключительно в обучающих целях.
    На CI готовых реализаций внятных нет.
    Исходя из того, что я написал, такой вариант имеет право на существование?
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Авторизация это и есть предоставление права на что-то. Если ты начнешь использовать правильные термины, станет понятнее что делать.
     
  5. tesla

    tesla Активный пользователь

    С нами с:
    29 фев 2016
    Сообщения:
    34
    Симпатии:
    1
    Спасибо, я это уже понял.
    Я просил бы Вас, что бы Вы прокомментировали исключительно эту строку моего опуса:
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не. каждый раз заново из бд извлекай нужную инфу по юзеру. и будет просто и понятно.
     
    artoodetoo нравится это.
  7. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Детали реализации я не понял из данного описания. Делай чтобы работало. А оптимизировать или исправлять будешь по факту.
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    он хочет при логине брать из бд инфу кто к какой странице имеет доступ, а хранить у юзера в сессии. нафик надо.
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Реально права должны заново проверяться при каждом запросе, а не кешироваться в сессии или ещё где. Так что не надо там складировать все ништяки.
    --- Добавлено ---
    @igordata держи лойс :D
    --- Добавлено ---
    @tesla, сделай контроль доступа в ООП стиле: не надо в контроллерах буквально читать таблицы и смотреть единички.
    Пусть будет некий объект "менеджер доступа", который отвечает на вопрос "имеет ли данный пользователь такую-то привилегию".
    Код (PHP):
    1. inteface AccessControl {
    2.   public function can($user, $action);
    3. }
    Сделай реализацию этого интерфейса через … ну хз я не понял откуда ты это собирался брать в сессию … а потом, если захочешь, сможешь реализовать новый класс с тем же интерфейсом, но уже через сторонний RBAC или ещё что. Не меняя кода своих контроллеров!
    Код (PHP):
    1. if (!$this->accessControl->can($currentUser, 'manage assets')) {
    2.   $this->redirect('/');
    3. }
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    сяпушки!
    --- Добавлено ---
    Сяп, сяпки, сяпушки - спасибо. Пример: Сяпушки! - Нез.