2013-04-17 5 views
3

Я новичок в Yii, и мне нужно кое-что исправить: есть некоторый контроллер с некоторыми действиями, и если пользователь пытается загрузить какое-либо действие, мне нужно проверить, разрешен ли он; если да, то выполните некоторые действия, если нет - перенаправить на страницу входа. Как мне это сделать? Надеюсь, мне не нужно проверять Yii :: user и перенаправлять вручную в каждом действии? Заранее спасибо.Yii авторизация и перенаправление

+0

Вы должны прочитать руководство по [Аутентификация и авторизация] (http://www.yiiframework.com/doc/guide/1.1/en/topics.auth). Кроме того, ваш вопрос не совсем ясен, потому что вы говорите, что если пользователь не * авторизован *, вы хотите отправить его на страницу входа в систему. Вы имели в виду * authenticated *? Это две разные вещи. Если пользователь аутентифицирован (== зарегистрирован), но не авторизован, что ему делать на странице входа? Он уже вошел в систему. –

+0

О, извините, я имею в виду, что если пользователь не вошел в систему, он должен уйти на страницу входа.Ваш комментарий хороший, и он работает, но скажите, как я могу установить контроллер/действие для метода loginRequired()? – user2218845

+0

Вы можете сделать это с помощью 'accessRules' так же, как объяснил PeterM. Однако вам не нужно добавлять так много правил. Добавьте один 'allow' с' 'users '=>' @ '' и один 'deny' без каких-либо дополнительных параметров. Прочтите все подробности [здесь] (http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#access-control-filter). –

ответ

-1

Просто добавьте этот

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

Надеется, что это помогает

+1

Вы не должны так поступать. Рекомендуемый способ сделать это с помощью 'if (Yii :: app() -> user-> isGuest) Yii :: app() -> user-> loginRequired();'. Он перенаправляет на страницу входа и сохраняет URL-адрес возврата для вас. –

+0

Но он просто хотел перенаправить –

+0

, пожалуйста, скажите, где я должен установить действие для авторизации? Я имею в виду config – user2218845

1

Используйте фильтры действий, при создании 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 
    ] 
+0

Спасибо, но контроль доступа ограничивает область, мне нужно другое дело, посмотрите на предыдущий комментарий – user2218845

+0

в конфигурации пользовательского компонента, есть '' loginUrl '=> ['/ua/user/login '] 'он перенаправит неавторизованного пользователя на этот url – 2013-04-17 17:55:13

0

я создал 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; 
} 
+0

Я не тестировал/не проверял этот точный код (для включения общедоступных страниц), но я могу проверить, что основа этого подхода отлично работает. –

0

В упрощенной версии примера Мохит Бхансали, я осуществил следующий код в моем 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.