如何在Yii中的索引页面上验证用户

时间:2012-01-02 07:57:59

标签: php authentication login yii

我正在使用Yii开发一个网站。

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

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

我在“view \ site \”目录中有 index.php login.php 也在同一目录中。

我在“\ controller”目录中有 sitecontroller.php (通常)

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

6 个答案:

答案 0 :(得分:9)

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

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'中我们指定允许哪些用户访问操作。 '*'表示所有用户,经过身份验证或未经身份验证。 '@'表示只有经过身份验证的用户,'admin'当然只表示管理员成员。

如果任何'actions'参数没有分配实际操作,那么只需删除而不是行:

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

答案 1 :(得分: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('*'),
        ),
    );
}

所以,它现在正在运作。

感谢所有人的宝贵回复

答案 2 :(得分: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 {

答案 3 :(得分: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();
    }
}

答案 4 :(得分:0)

您可以查看此帖子

Special Topic - Authentication and Authorization

Yii Wiki

检查示例博客应用程序以获得帖子控制器

答案 5 :(得分:0)

关于SecurityController组件建议:

  

类Sec​​urityController扩展CController

也许是因为更新的版本:我不得不从Controller扩展SecurityController以使其工作。但它起到了魅力的作用