Как аутентифицировать пользователя на странице индекса в Yii - PullRequest
3 голосов
/ 02 января 2012

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

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

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

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

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

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

Ответы [ 6 ]

9 голосов
/ 02 января 2012

Просто добавьте следующее в верхней части действия 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('*'),
        ),
    );
}

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

Если для каких-либо параметров 'actions' не назначены фактические действия, просто удалите строку:

        array('allow',
                   'users'=>array('admin'),
        ), 
1 голос
/ 16 января 2013

Попробуйте для принудительного входа в систему для всех страниц в 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();
    }
}
1 голос
/ 07 июня 2012

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

Добавить новый компонент в каталог компонентов (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 {
1 голос
/ 03 января 2012

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

Вот код, который я добавил в 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('*'),
        ),
    );
}

Итак, теперь он работает.

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

0 голосов
/ 08 января 2013

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

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

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

0 голосов
/ 02 января 2012

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

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

Yii Wiki

Проверить образец блога Appдля пост-контроллера

...