Как аутентифицировать пользователя на индексной странице в Yii

Я разрабатываю веб-интерфейс с помощью Yii.

Когда я создаю модуль с использованием генератора кода gii, он автоматически добавит аутентификацию на страницу администратора этой конкретной модели и контроллера.

Но я хочу добавить аутентификацию пользователя на самой странице индекса. Итак, когда пользователь открывает сайт, он должен попросить логин.

У меня есть index.php внутри каталога «view \ site \», а login.php также находится в том же каталоге.

У меня есть sitecontroller.php в каталоге «\ controller» (как обычно)

Это мой первый проект в структуре Yii. Кто-то предлагает мне, как применять аутентификацию пользователя, когда открывается веб-сайт.

Просто добавьте следующее в начало действия index () SiteController:

if(Yii::app()->user->getId()===null) $this->redirect(array('site/login')); 

Он проверяет, зарегистрирован ли пользователь. Если это не так, страница будет перенаправлена ​​на логин.

Чтобы избежать каких-либо действий, к которым обращались не зарегистрированные пользователи, вам необходимо изменить функции accessRules () ваших контроллеров:

 public function accessRules() { return array( array('allow', 'actions'=>array(), 'users'=>array('*'), ), array('allow', 'actions'=>array(), 'users'=>array('@'), ), array('allow', 'actions'=>array(), 'users'=>array('admin'), ), array('deny', 'actions'=>array(), 'users'=>array('*'), ), ); } 

В каждом контроллере у нас есть эта функция, и внутри нее у нас есть четыре массива. Каждый массив объявляет правило доступа. В параметре «действия» мы укажем, какие действия будут затронуты этим правилом доступа, а в «users» мы укажем, какие пользователи будут иметь доступ к действиям. '*' означает всех пользователей, прошедших проверку подлинности или не прошедших проверку подлинности. «@» означает только аутентифицированных пользователей, «admin» означает, конечно, только членов-админов.

Если какие-либо параметры «действия» не имеют действительных назначенных действий, просто удалите строку:

  array('allow', 'users'=>array('admin'), ), 

Хорошо, я сделал это наконец.

Вот код, я добавил к sitecontroller.php

 public function filters() { return array( 'accessControl', ); } public function accessRules() { return array( array('allow', // allow all users to perform only 'login' action 'actions'=>array('login'), 'users'=>array('*'), ), array('allow', // allow admin user to perform 'admin' AND 'delete' AND 'index' actions 'actions'=>array('admin','delete','index'), 'users'=>array('admin'), ), array('deny', // deny all users 'users'=>array('*'), ), ); } 

Итак, он работает сейчас.

спасибо всем за ваши ценные ответы

Это то же самое, что и выше, но как компонент, так что это нужно делать только один раз, и все контроллеры, нуждающиеся в безопасности, могут расширить этот компонент.

Добавьте новый компонент в каталог компонентов ( SecurityController.php ):

 <?php class SecurityController extends CController { public $breadcrumbs=array(); public function filters() { return array( 'accessControl', ); } public function accessRules() { return array( array('allow', //'actions'=>array('admin','delete','index'), 'users'=>array('admin', '@'), ), array('deny', // deny all users 'users'=>array('*'), ), ); } } 

Теперь убедитесь, что все ваши контроллеры, которым требуется аутентификация, наследуются от SecurityController :

 <?php class JSController extends SecurityController { 

Попробуйте его для принудительного входа для всех страниц в Yii:

http://www.larryullman.com/2010/07/20/forcing-login-for-all-pages-in-yii/

И для принудительного входа на индексную страницу вы можете настроить

 public function handleBeginRequest($event) { if (Yii::app()->user->isGuest && !in_array($_GET['r'],array('site/login'))) { Yii::app()->user->loginRequired(); } } 

Вы можете проверить это сообщение

Специальная тема – аутентификация и авторизация

Yii Wiki

Проверьте образец приложения для Blog для постконтроллера

Что касается предложения компонента SecurityController:

класс SecurityController расширяет CController

Возможно, из-за более новой версии: мне пришлось расширить SecurityController от Controller, чтобы он работал. Но тогда это работает как шарм