Я новичок в Yii, и мне нужно кое-что исправить: есть некоторый контроллер с некоторыми действиями, и если пользователь пытается загрузить какое-либо действие, мне нужно проверить, разрешен ли он; если да, то выполните некоторые действия, если нет - перенаправить на страницу входа. Как мне это сделать? Надеюсь, мне не нужно проверять Yii :: user и перенаправлять вручную в каждом действии? Заранее спасибо.Yii авторизация и перенаправление
ответ
Просто добавьте этот
if(Yii::app()->user->getId()===null) {
// This is the case where user is not logged in so redirect
$this->redirect(array('site/login'));
} else {
// this is the case where user is logged in
// do your business
}
Существует очень хорошая SO размещения, которое уже существует, вы можете обратиться к тому, что для вашего случая
How to authenticate user on index page in Yii
Надеется, что это помогает
Вы не должны так поступать. Рекомендуемый способ сделать это с помощью 'if (Yii :: app() -> user-> isGuest) Yii :: app() -> user-> loginRequired();'. Он перенаправляет на страницу входа и сохраняет URL-адрес возврата для вас. –
Но он просто хотел перенаправить –
, пожалуйста, скажите, где я должен установить действие для авторизации? Я имею в виду config – user2218845
Используйте фильтры действий, при создании yii crud есть базовый фильтр управления доступом. Вот документы о фильтрах:
http://www.yiiframework.com/doc/guide/1.1/en/basics.controller#filter
Темы с готовым решением для Controle доступа здесь: http://www.yiiframework.com/doc/guide/1.1/pl/topics.auth#sec-3
Короче говоря, создать метод в контроллере:
public function filters()
{
return array(
'accessControl',
);
}
А затем определить правила доступа для действий с использованием метода:
public function accessRules()
{
return array(
array('deny',
'actions'=>array('create', 'edit'),
'users'=>array('?'),
),
array('allow',
'actions'=>array('delete'),
'roles'=>array('admin'),
),
array('deny',
'actions'=>array('delete'),
'users'=>array('*'),
),
);
}
EDIT
Чтобы определить URL для перенаправления, если пользователь не прошел проверку подлинности, определить его в компоненте пользователя:
'user' => [
'class' => 'CWebUser', // or custom
'allowAutoLogin' => true, // for autologin
'loginUrl' => ['/ua/user/login'], // if not authenticated go here
]
Спасибо, но контроль доступа ограничивает область, мне нужно другое дело, посмотрите на предыдущий комментарий – user2218845
в конфигурации пользовательского компонента, есть '' loginUrl '=> ['/ua/user/login '] 'он перенаправит неавторизованного пользователя на этот url – 2013-04-17 17:55:13
я создал AdminModule.php. В этом случае я создал функцию, которая будет проверять, зарегистрирован ли пользователь или нет. А также есть общедоступные страницы, для которых не требуется вход в систему.
public function beforeControllerAction($controller, $action)
{
if(parent::beforeControllerAction($controller, $action))
{
// this overwrites everything in the controller
$controller->layout = 'admin';
// this method is called before any module controller action is performed
// you may place customized code here
$route=$controller->id.'/'.$action->id;
$publicPages=array(
'user/login',
'default/error',
);
if($this->password!==false && Yii::app()->user->isGuest && !in_array($route,$publicPages))
Yii::app()->user->loginRequired();
else
return true;
}
else
return false;
}
Я не тестировал/не проверял этот точный код (для включения общедоступных страниц), но я могу проверить, что основа этого подхода отлично работает. –
В упрощенной версии примера Мохит Бхансали, я осуществил следующий код в моем AdminModule:
public function beforeControllerAction($controller, $action)
{
if(parent::beforeControllerAction($controller, $action)) {
if (Yii::app()->user->isGuest) {
Yii::app()->user->loginRequired();
} elseif (Yii::app()->user->id != 'myadminuser') {
throw new CHttpException(403, 'You are not authorized to perform this action.');
}
return true;
} else {
return false;
}
}
Я тогда был также в состоянии удалить из каждого контроллера модуля администратора возвращения массива AccessControl в фильтрах() (должно содержать функцию empty filter() на месте), и полностью удалить accessRules(). Например, вот контроллера по умолчанию:
class DefaultController extends Controller
{
public function filters()
{
}
public function actionIndex()
{
$this->render('index');
}
}
Стоит также отметить, что использование RBAC можно посоветовать что-нибудь больше, чем просто контроль доступа, и если бы мы использовали RBAC здесь, мы бы назвали Yii :: приложение () -> user-> checkAccess() вместо проверки Yii :: app() -> user-> id в AdminModule.
Вы должны прочитать руководство по [Аутентификация и авторизация] (http://www.yiiframework.com/doc/guide/1.1/en/topics.auth). Кроме того, ваш вопрос не совсем ясен, потому что вы говорите, что если пользователь не * авторизован *, вы хотите отправить его на страницу входа в систему. Вы имели в виду * authenticated *? Это две разные вещи. Если пользователь аутентифицирован (== зарегистрирован), но не авторизован, что ему делать на странице входа? Он уже вошел в систему. –
О, извините, я имею в виду, что если пользователь не вошел в систему, он должен уйти на страницу входа.Ваш комментарий хороший, и он работает, но скажите, как я могу установить контроллер/действие для метода loginRequired()? – user2218845
Вы можете сделать это с помощью 'accessRules' так же, как объяснил PeterM. Однако вам не нужно добавлять так много правил. Добавьте один 'allow' с' 'users '=>' @ '' и один 'deny' без каких-либо дополнительных параметров. Прочтите все подробности [здесь] (http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#access-control-filter). –