Как Вы сделали авторизацию?
Как Вы сделали авторизацию?
Я создал тестовое приложение. Делал все как показано в офф. руководстве и менял всю авторизацию на популярные расширения yii-user и yii-rights.
Мне категорически непонятна ситуация, когда после авторизации пользователя (как с вводом данных, так и через cookie) - id, name и states записываются в сессию и более не обновляются до последующей авторизации.
Я не понимаю логики данного метода. Получается, что если я в процессе работы изменю роль пользователя или забаню его - оно применится только после повторного входа пользователя в систему, а не сразу.
Как Вы решили данный вопрос, и решали ли вообще? Единственное удобство, которое я наблюдаю в данном методе, это нет постоянных запросов в базу данных для аутентификации пользователя. Если проект имеет много пользователей - это плюсег, но он никак не сравнится с минусом - моментальный бан пользователя и изменение прав.
Мне категорически непонятна ситуация, когда после авторизации пользователя (как с вводом данных, так и через cookie) - id, name и states записываются в сессию и более не обновляются до последующей авторизации.
Я не понимаю логики данного метода. Получается, что если я в процессе работы изменю роль пользователя или забаню его - оно применится только после повторного входа пользователя в систему, а не сразу.
Как Вы решили данный вопрос, и решали ли вообще? Единственное удобство, которое я наблюдаю в данном методе, это нет постоянных запросов в базу данных для аутентификации пользователя. Если проект имеет много пользователей - это плюсег, но он никак не сравнится с минусом - моментальный бан пользователя и изменение прав.
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: Как Вы сделали авторизацию?
если бан - logout
если сменили роль, то она как правило не хранится в сессии, а в бд, тогда она применится при первой выборке, т.е. после след. обращения к сайту
если сменили роль, то она как правило не хранится в сессии, а в бд, тогда она применится при первой выборке, т.е. после след. обращения к сайту
Re: Как Вы сделали авторизацию?
Внезапно родилась идея.
В yii-user есть отличный пример.
т.е. перед тем, как будет выполнено действие, требующее каких-то прав - надо сделать выборку из базы всех админов. Если данный пользователь не попадет под этот список - доступ будет запрещен. Т.е. если даже пользователь был админом, но его заблокировали или изменили права - он хоть и останется (якобы) залогинен, но не получит прав доступа к этому действию.
Такой вопрос - используя CPhpAuthManager - возможно ли организовать такую проверку, чтобы для действий требующих прав больше чем guest - обновлять регистрационные данные пользователя?
В yii-user есть отличный пример.
Код: Выделить всё
public function accessRules()
{
return array(
array('allow', // allow admin user to perform 'admin' and 'delete' actions
'actions'=>array('admin','delete','create','update','view'),
'users'=>UserModule::getAdmins(),
),
array('deny', // deny all users
'users'=>array('*'),
),
);
}
Такой вопрос - используя CPhpAuthManager - возможно ли организовать такую проверку, чтобы для действий требующих прав больше чем guest - обновлять регистрационные данные пользователя?
Re: Как Вы сделали авторизацию?
Я в сессии храню только id name и hash, который так-же хранится в куках для входа через куки.lancecoder писал(а):если бан - logout
если сменили роль, то она как правило не хранится в сессии, а в бд, тогда она применится при первой выборке, т.е. после след. обращения к сайту
В каком месте кода вы проверяете, что пользователь оказался забаненым? Т.е. при каждом обращении пользователя вы заново проходите операцию CWebUser::login()?
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: Как Вы сделали авторизацию?
ууу, да вы не представляете общую картину авторизации через куки, почитайте мануал
п.с. beforeLogin
п.с. beforeLogin
Re: Как Вы сделали авторизацию?
Код: Выделить всё
protected function beforeLogin($id, $states, $fromCookie) {
if (parent::beforeLogin($id, $states, $fromCookie)) {
if ($fromCookie) {
//Находим в базе пользователя по ID
$user = User::model()->active()->findByPk($id);
if ($user === null)
return false;
else if ($user->hash !== $states["auth"])
return false;
else {
return true;
}
} else {
return true;
}
} else {
return false;
};
}
Но оно срабатывает только после окончании срока действии сессии. This method is called before logging in a user. For example, when the login is cookie-based, you may want to verify that the user ID together with a random token in the states can be found in the database. Что собственно я и сделал.
Я проверял удалением из куков PHPSESSID. Оно срабатывает только тогда. Логер подтверждает выполнение данного действия созданным запросом. Соответственно создается новая сессия и повторная авторизация не требуется.
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: Как Вы сделали авторизацию?
ну добавь еще в init
if (!Yii::app()->getUser()->getIsGuest()){
}
if (!Yii::app()->getUser()->getIsGuest()){
}
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: Как Вы сделали авторизацию?
проверяй там статус, если забанен, то на логаут его редиректь
Re: Как Вы сделали авторизацию?
Код: Выделить всё
public function init() {
if (!Yii::app()->user->isGuest) {
//Ищем активного пользователя где id совпадает с user->id
$user = User::model()->active()->findByPk(Yii::app()->user->id);
if ($user === null) {
Yii::app()->user->logout();
$this->redirect(Yii::app()->homeUrl);
}
}
}
Re: Как Вы сделали авторизацию?
подпишусь, т.к. скоро мне это предстоит.
Re: Как Вы сделали авторизацию?
я делаю похоже, только еще кеширую
Re: Как Вы сделали авторизацию?
А подробнее? Что кешируете?
Вопрос как раз в том, как люди организовывают авторизацию и аутентификацию пользователей на сайтах.
Если есть более безопасные методы или более гибкие в плане поддержки - делитесь)) т.к. в официальном руководстве тема затрагивается поверхностно и с плохими примерами.
Может кто-то использует расширения, кто-то использует OpenID или привязку к другим сервисам?
Встроенная в фрэймворк система сложна для первого понимания.
Лично мне было бы удобно в init засунуть не только проверку на статус пользователя, но и присваивание всех (безопасных) значений из базы user в некоторое свойство класса user(ошибка, класса WebUser) так, чтобы они были доступны в любом месте кода (например: yii::app()->user->base['значение']), но не появлялись в сессии и в куках.
Это удобно тем, что иногда в коде придется обращаться к данным свойствам городя новый запрос, который уже был выполнен в init.
Вопрос как раз в том, как люди организовывают авторизацию и аутентификацию пользователей на сайтах.
Если есть более безопасные методы или более гибкие в плане поддержки - делитесь)) т.к. в официальном руководстве тема затрагивается поверхностно и с плохими примерами.
Может кто-то использует расширения, кто-то использует OpenID или привязку к другим сервисам?
Встроенная в фрэймворк система сложна для первого понимания.
Лично мне было бы удобно в init засунуть не только проверку на статус пользователя, но и присваивание всех (безопасных) значений из базы user в некоторое свойство класса user(ошибка, класса WebUser) так, чтобы они были доступны в любом месте кода (например: yii::app()->user->base['значение']), но не появлялись в сессии и в куках.
Это удобно тем, что иногда в коде придется обращаться к данным свойствам городя новый запрос, который уже был выполнен в init.
- lancecoder
- Сообщения: 2532
- Зарегистрирован: 2012.06.26, 17:16
Re: Как Вы сделали авторизацию?
ну так а модель присвоить это разве не безопасные аттрибуты пользователя?
Re: Как Вы сделали авторизацию?
Код: Выделить всё
protected function beforeAction($action)
{
if(parent::beforeAction($action))
{
if(!Yii::app()->user->isGuest)
{
$enabled = Yii::app()->cache->get('user_enabled:' . Yii::app()->user->id);
if($enabled === false)
{
$enabled = Yii::app()->db->createCommand('SELECT enabled FROM user WHERE id = ' . Yii::app()->user->id)->queryScalar();
Yii::app()->cache->set('user_enabled:' . Yii::app()->user->id, $enabled, 360);
}
if(!$enabled)
{
Yii::app()->user->logout();
throw new CHttpException(403);
}
}
}
return true;
}
Re: Как Вы сделали авторизацию?
Ммм... фирсштейн, куда удобнее!!
Re: Как Вы сделали авторизацию?
и, желательно, не забывать сбрасывать (обновлять) кеш при бане юзера