如何在Yii的索引页上对用户进行身份验证


How to authenticate user on index page in Yii

我正在使用Yii开发一个web。

当我使用gii代码生成器创建模块时,它会自动将身份验证添加到特定模型和控制器的管理页面。

但是我想在索引页本身添加用户身份验证。因此,当用户打开网站时,它应该要求登录。

index.php在"view'site'"目录下,login.php也在同一目录下。

我有 sitcontroller .php在"'controller"目录(通常)

这是我在Yii框架中的第一个项目。有人建议我如何应用用户身份验证,当网站打开。

只需在SiteController的index()动作的顶部添加以下内容:

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

它将检查用户是否已登录。如果不是这样,页面将重定向到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"参数中,我们指定哪些用户将被允许访问这些操作。"*"表示所有用户,无论是已验证的还是未验证的。"@"表示仅通过身份验证的用户,"admin"当然表示仅管理员成员。

如果任何'actions'参数没有分配实际操作,则只需删除该行:

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

好了,我终于完成了。

下面是代码,我已经添加到 sitcontroller .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('*'),
        ),
    );
}

所以,它现在工作了。

感谢大家的宝贵回复

这与上面的相同,但作为一个组件,所以它只需要完成一次,所有需要安全的控制器都可以扩展这个组件。

在components目录(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维基

查看示例博客应用程序的post控制器

关于SecurityController组件的建议:

类SecurityController扩展CController

可能是因为更新的版本:我必须从Controller扩展SecurityController以使其工作。但这是一种魅力