2012-01-02 3 views
3

Я занимаюсь разработкой сети с помощью Yii.Как аутентифицировать пользователя на индексной странице в Yii

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

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

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

У меня есть SiteController.php в директории "\" контроллера (как обычно)

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

ответ

9

Просто добавьте следующую строку в верхней части индекса 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'), 
     ), 
+0

Он работал нормально, но только для действия index(). Можно ли использовать прямой URL-адрес (если знаете) для просмотра других страниц? –

+0

Да ... В этом случае позвольте мне уточнить свой ответ ... –

0

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

Special Topic - Authentication and Authorization

Yii Wiki

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

+0

Просто определить фильтр контроля доступа для вашего index.php http://www.yiiframework.com/doc/guide/1.1/en/topics.auth#access-control-filter, как на страницах администратора. – schmunk

+0

Я сделал изменения, и теперь он дает ошибку для цикла переадресации:/ –

+0

@darshit: если все еще ошибка сохраняется, напишите его здесь. Update yr ques .. –

1

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

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

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

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

1

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

Добавить новый компонент в каталоге компонентов (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 { 
0

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

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

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

1

Попробуйте для Принуждение Вход для всех страниц в 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(); 
    } 
} 
Смежные вопросы