#php #model-view-controller #orm #kohana
#php #модель-представление-контроллер #orm #kohana
Вопрос:
Я использую код прямо из руководства kohana для защиты веб-сайтов на основе учетных данных для входа
Проблема в том, что код, похоже, проверяет только, вошел ли пользователь в систему, и не различает роли.
Как мне изменить этот скрипт, чтобы разрешить доступ к этому действию только администратору
В базовом контроллере у меня есть код
public $assert_auth = FALSE;
public $assert_auth_actions = FALSE;
public function before()
{
parent::before();
$this->_user_auth();
}
protected function _user_auth()
{
$action_name = Request::instance()->action;
if (($this->assert_auth !== FALSE amp;amp; Auth::instance()->logged_in($this->assert_auth) === FALSE)
|| (is_array($this->assert_auth_actions) amp;amp; array_key_exists($action_name, $this->assert_auth_actions)
amp;amp; Auth::instance()->logged_in($this->assert_auth_actions[$action_name]) === FALSE))
{
if (Auth::instance()->logged_in())
{
Request::instance()
->redirect('');
}
else
{
Request::instance()
->redirect('admin/login');
}
}
в контроллерах для страниц администратора есть код
public $assert_auth_actions = array(
'index' => array('login')
);
Ответ №1:
Сначала я хочу отметить, что приведенный выше код предназначен для Kohana 3.0, для 3.1 и выше вы должны заменить Request::instance()->action на Request::$current->action() .
Если вы хотите, чтобы все требования к авторизации были одинаковыми для всех действий в контроллере, затем установите $assert_auth в массив, содержащий список всех ролей, которые нужно иметь для доступа к нему.
Если вам нужны разные требования к авторизации для действий в одном и том же контроллере, задайте для $assert_auth_actions значение многомерного массива. Первым измерением должно быть имя действия, выберите список ролей, которые пользователь должен иметь для доступа к действию.
Комментарии:
1. Спасибо, это имеет смысл! Кажется, у меня сейчас другая проблема. Я изменил авторизованную роль на admin, и это сработало при блокировке обычных пользователей. Следующее, что я сделал, это изменил роль тестовых пользователей в таблицах role_users на 2 для тестирования. Этот пользователь вообще не может быть зарегистрирован. Отличается ли метод входа в систему администратора от обычного пользователя? $user = ORM::factory(‘user’); $status = $user->login($_POST);
2. Есть ли у тестируемого пользователя роль входа в систему?
3. Да, я настраиваю таблицы аутентификации, используя схему по умолчанию users, roles, role_users Все методы, связанные с входом / выходом / регистрацией, работают нормально, первое, что я попробовал, это просто изменить роль с 1 на 2 в таблице role_users, и в этот момент пользователь больше не может войти во вторуюя пытался изменить свой регистрационный код, чтобы сохранить пользователя в качестве роли 2, которая является администратором
$user->add('roles', ORM::factory('role')->find(1));
, в базе данных все выглядит нормально, пользователь сохранен и сохранен role_user, но я все еще не могу войти в систему с этим пользователем4. извините, я хотел сказать, что я изменил роль добавления
$user->add('roles', ORM::factory('role')->find(2));
в основном кажется, что пользователь не может войти в систему, когда у него есть роль администратора5. У пользователей может быть много ролей, Auth позволит им войти в систему только в том случае, если роль входа входит в его набор ролей. Пользователь X может иметь следующие роли: логин, администратор, модератор, автор, редактор. Итак, если вам нужна учетная запись администратора, которая может входить в систему, ей понадобятся роли КАК login, ТАК И admin.