Всем привет, вопрос тут назрел. Каким образом реализовывается делегирование прав доступа? "Костяк" на CI3. Пример такой: есть админка, в которой изначально есть три раздела. Довольно тривиальное решение - сделать таблицу для юзеров "не админов" (админ по умолчанию может все): user_id, section1, section2,section3 ну и при занесении пользователя проставлять 1 - есть доступ, 0- нет доступа. Каким образом реализовать проверку с последующим хранением результатов? Это должно быть в авторизации, авторизация у меня в конструкторе контроллера admin. То есть при авторизации чекать таблицу users_role и хранить всю цепочку [section1=>1, section2=>0,section3=>1] (например) где нибудь в сессиях, а при обращении к контроллеру нужного раздела делать проверку: если 1 - мы попадаем в index если нет - выводить сообщение о недостатке прав или редирект на главную.. или это бред?
Хотелось бы на примере своего велосипеда. Исключительно в обучающих целях. На CI готовых реализаций внятных нет. Исходя из того, что я написал, такой вариант имеет право на существование?
Авторизация это и есть предоставление права на что-то. Если ты начнешь использовать правильные термины, станет понятнее что делать.
Спасибо, я это уже понял. Я просил бы Вас, что бы Вы прокомментировали исключительно эту строку моего опуса:
Детали реализации я не понял из данного описания. Делай чтобы работало. А оптимизировать или исправлять будешь по факту.
он хочет при логине брать из бд инфу кто к какой странице имеет доступ, а хранить у юзера в сессии. нафик надо.
Реально права должны заново проверяться при каждом запросе, а не кешироваться в сессии или ещё где. Так что не надо там складировать все ништяки. --- Добавлено --- @igordata держи лойс --- Добавлено --- @tesla, сделай контроль доступа в ООП стиле: не надо в контроллерах буквально читать таблицы и смотреть единички. Пусть будет некий объект "менеджер доступа", который отвечает на вопрос "имеет ли данный пользователь такую-то привилегию". Код (PHP): inteface AccessControl { public function can($user, $action); } Сделай реализацию этого интерфейса через … ну хз я не понял откуда ты это собирался брать в сессию … а потом, если захочешь, сможешь реализовать новый класс с тем же интерфейсом, но уже через сторонний RBAC или ещё что. Не меняя кода своих контроллеров! Код (PHP): if (!$this->accessControl->can($currentUser, 'manage assets')) { $this->redirect('/'); }