Я разрабатываю веб-интерфейс с помощью 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, чтобы он работал. Но тогда это работает как шарм