【问题标题】:How to authenticate user on index page in Yii如何在 Yii 的索引页面上对用户进行身份验证
【发布时间】:2012-01-02 07:57:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: php authentication login yii


    【解决方案1】:

    只需在 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'),
            ), 
    

    【讨论】:

    • 它运行良好,但仅适用于 index() 操作。用户可以直接使用 url(如果知道)来查看其他页面,对吗?
    【解决方案2】:

    好的,我终于做到了。

    这是代码,我已添加到 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('*'),
            ),
        );
    }
    

    所以,它现在可以工作了。

    感谢大家的宝贵回复

    【讨论】:

      【解决方案3】:

      这和上面一样,但是作为一个组件,它只需要执行一次,所有需要安全的控制器都可以扩展这个组件。

      在组件目录中添加一个新组件(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 {
      

      【讨论】:

        【解决方案4】:

        尝试在 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();
            }
        }
        

        【讨论】:

          【解决方案5】:

          您可以查看此帖子

          Special Topic - Authentication and Authorization

          Yii Wiki

          检查后控制器的示例博客应用

          【讨论】:

          • 只需为您的 index.php yiiframework.com/doc/guide/1.1/en/… 定义一个访问控制过滤器,就像在管理页面上一样。
          • 我已经进行了相应的更改,现在它给出了重定向循环错误:/
          • @Rajat 根据我的需要,alfredo 给出的解决方案工作得很好。但后来我想出了另一个问题,那就是:有人可以使用直接 url 访问网站的其他页面,(如果他们知道的话)所以我正在解决这个问题,所以没有人可以直接访问网址也是..
          • 如果您还没有解决问题..将其添加为新问题..:)
          【解决方案6】:

          关于 SecurityController 组件建议:

          类 SecurityController 扩展 CController

          可能是因为版本较新:我必须从 Controller 扩展 SecurityController 才能使其工作。但后来它作为一种魅力发挥作用

          【讨论】:

            猜你喜欢
            • 2015-05-11
            • 1970-01-01
            • 2017-06-26
            • 1970-01-01
            • 2014-10-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多