`
zjb3165
  • 浏览: 20969 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
最近访客 更多访客>>
社区版块
存档分类
最新评论

在yii中新增一个用户验证

    博客分类:
  • yii
阅读更多

1.为什么要新增一个用户验证:

    因为我要将网站后台和前台做在同一个yii的应用中.但是前台也包含有会员的管理中心.而这两个用户验证是完全不同的,所以需要两个不同登陆页面,要将用户信息保存在不同的cookie或session中.所以需要在一个应用中增加一个用户验证

 

2.yii的用户验证:

   在自定义用户验证前,我们首先要弄清楚yii的验证和授权方式.

   为了验证一个用户,我们需要定义一个有验证逻辑的验证类.在yii中这个类需要实现IUserIdentity接口,不同的类就可以实现不同的验证方法.网站登陆一般需要验证的就是用户名和密码,yii提供了CUserIdentity类,这个类一般用于验证用户名和密码的类.继承后我们需要重写其中的authenticate()方法来实现我们自己的验证方法.具体代码如下:

class UserIdentity extends CUserIdentity
{
    private $_id;
    public function authenticate()
    {
        $record=User::model()->findByAttributes(array('username'=>$this->username));
        if($record===null)
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if($record->password!==md5($this->password))
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else
        {
            $this->_id=$record->id;
            $this->setState('title', $record->title);
            $this->errorCode=self::ERROR_NONE;
        }
        return !$this->errorCode;
    }
 
    public function getId()
    {
        return $this->_id;
    }
}

 在用户登陆时则调用如下代码:

// 使用提供的用户名和密码登录用户
$identity=new UserIdentity($username,$password);
if($identity->authenticate())
    Yii::app()->user->login($identity);
else
    echo $identity->errorMessage;

 用户退出时,则调用如下代码:

// 注销当前用户
Yii::app()->user->logout();

 其中的user是yii的一个components.需要在protected/config/main.php中定义

'user'=>array(
	// enable cookie-based authentication
	'allowAutoLogin'=>true,
        'loginUrl' => array('site/login'),
),

 这里我们没有指定user的类名.因为在yii中默认user为CWebUser类的实例.

我们现在已经实现了用户的登陆验证和退出.但是现在无论是否登陆,用户都能访问所有的action,所以下一步我们要对用户访问进行授权.在yii里是通过Access Control Filter即访问控制过滤器来实现用户授权的.我们看一下一个简单的带有访问控制的Controller:

class AdminDefaultController extends CController
{
    
	public function filters()
        {
            return array('accessControl');
        }

        public function accessRules()
        {
            return array(
                array(
                    'allow',
                    'users' => array('@'),
                ),
                array(
                    'deny',
                    'users' => array('*')
                ),
            );
        }
}

 我们在filters方法中设置具体的filter.我们可以看到在filters方法返回的array里有accessControl参数,在CController类中有一个filterAccessControl方法:

public function filterAccessControl($filterChain)
{
	$filter=new CAccessControlFilter;
	$filter->setRules($this->accessRules());
	$filter->filter($filterChain);
}

 在里面新建了一个CAccessControlFilter实例,并且在setRules时传入了accessRules()方法返回的参数.

$filter->filter($filterChain)则是继续调用其它filter.

而所有具体的授权规则则是定义在accessRules中:

public function accessRules()
    {
        return array(
            array('deny',
                'actions'=>array('create', 'edit'),
                'users'=>array('?'),
            ),
            array('allow',
                'actions'=>array('delete'),
                'roles'=>array('admin'),
            ),
            array('deny',
                'actions'=>array('delete'),
                'users'=>array('*'),
            ),
        );
    }

 具体规则参见yii的手册.

 

3.新增一个验证体系:

首先我们从CWebUser继承一个CAdminUser:

class CAdminWebUser extends CWebUser
{
    public $loginUrl = array('admin/admin/login');
}

 我们需要把他放置到components中

如果是全局应用则通过protected/config/main.php的components小节:

'user'=>array(
	// enable cookie-based authentication
        'class' => 'CAdminUser',
	'allowAutoLogin'=>true,
       'loginUrl' => array('site/login'),
),

 如果是在modules中则在模块类的init方法中添加如下代码:

$this->setComponents(array(
       'adminUser' => array(
                'class' => 'CAdminWebUser',
                'allowAutoLogin' => false,
        )
));

 最后调用方式

//全局应用
Yii::app()->getComponent('adminUser');
//在模块中
Yii::app()->controller->module->getComponent('adminUser');

 但仅仅这样还不够,我们还需要修改Controller的filter,我们需要自定义一个filter,来实现另一个用户的验证和授权

第一步自定义一个filter:

class CAdminAccessControlFilter extends CAccessControlFilter
{
    protected function preFilter($filterChain)
    {
        $app=Yii::app();
		$request=$app->getRequest();
		$user = Yii::app()->controller->module->getComponent('adminUser');
		$verb=$request->getRequestType();
		$ip=$request->getUserHostAddress();
	
	    foreach($this->getRules() as $rule)
		{
	        if(($allow=$rule->isUserAllowed($user,$filterChain->controller,$filterChain->action,$ip,$verb))>0) // allowed
				break;
	        else if($allow<0) // denied
	        {
				$this->accessDenied($user);
				return false;
	        }
		}

        return true;
    }
}

 再重写CController类的filterAccessController方法

public function filterAccessControl($filterChain)
{
	$filter = new CAdminAccessControlFilter();
	$filter->setRules($this->accessRules());
	$filter->filter($filterChain);
}
//在这里我们使用自定义的filter类替换了原来的filter

 OK,到这里我们就可以在此Controller的accessRules()中指定adminUser的授权了

分享到:
评论
1 楼 sxtuwy 2012-12-09  
    //全局应用 
    Yii::app()->getComponent('adminUser'); 
    //在模块中 
    Yii::app()->controller->module->getComponent('adminUser'); 
上面这一部分应该放在哪里呢?
那后台用户应该怎么访问:Yii::app()->adminUser->id,是这样吗?

相关推荐

    在yii中新增一个用户验证的方法详解

    本篇文章是对在yii中新增一个用户验证的方法进行了详细的分析介绍,需要的朋友参考下

    Yii 中文帮助文档

    对于想使用 Yii 的开发者而言,熟悉面向对象编程(OOP)会使开发更加轻松,因为 Yii 就是一个纯 OOP 框架。 Yii 适合做什么? Yii 是一个通用 Web 编程框架,能够开发任何类型的 Web 应用。它是轻量级的,又装配了很...

    yii框架中文文档、yii中文手册教程

    yii1.1中文文档 yii框架中文手册教程.pdf

    Yii2中文手册(中文教程完整版)

    编撰中 数据库迁移(Migration) - 在团体开发中对你的数据库使用版本控制 待定中 Sphinx 待定中 Redis 待定中 MongoDB 待定中 ElasticSearch 接收用户数据 编撰中 创建表单 已定稿 输入验证 编撰中 文件上传 待定中...

    Yii 2.0开发一个仿京东商城平台

    Yii 2.0开发一个仿京东商城平台,视频加源码,无加密。

    Yii2.0打造京东商城平台PHP电商实战Yii2.0视频教程

    教程名称:Yii2.0 打造京东商城平台 PHP电商实战 Yii2.0视频教程 教程内容: 包含了电商的所有...不错的学习YII框架的基础课程,电商系统的结构完整、框架资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    基于YII2的中文验证码

    因为YII2不支持中文验证码,所以写了一个,欢迎下载 支持成语产生。 使用说明在PSCaptcha.php文件中 压缩包内带字体,所以有些大 文件放到 common\libs\captcha 目录,没有就新建 * PSCaptcha 产生一个验证码图片. ...

    yii框架yii框架yii框架yii框架yii框架

    很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架

    Yii2.0中文学习手册

    Yii2.0中文学习手册

    YII框架中文手册

    YII框架中文手册,希望帮助需要帮助的人!

    yii2框架实现验证码的添加以及验证

    yii2框架实现验证码的添加以及验证

    yii2-user, 灵活的Yii2用户注册和认证模块.zip

    yii2-user, 灵活的Yii2用户注册和认证模块 Yii2-user 大多数网络应用程序都提供了一种用户登录。登录或者重新设置自己忘记密码。 你可以使用Yii2-user灵活的用户管理模块来处理常见任务,比如注册。认证和密码检索,...

    Yii中文教程

    权威的yii框架中文版开发文档,希望能够为您的yii框架学习带来帮助,让你的技术更上一层楼! zhihuizhan.com

    yii框架中文手册教程

    yii框架中文手册教程,Yii 是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。它将 Web 编程中的可重用性发挥到极致, 能够显著加速开发进程。Yii(读作“易”)代表简单(easy)、高效(efficient)、可扩展...

    yii框架中文手册教程和YII模板

    yii框架中文手册教程和YII模板 我很辛苦才找到的

    Yii2中文手册pdf版

    yii中文手册,你可以通过两种方式安装 Yii:使用 Composer 或下载一个归档文件。推荐使用前者,这样只需执行一条 简单的命令就可以安装新的扩展或更新 Yii 了。 注意:和 Yii 1 不同,以标准方式安装 Yii 2 时会同时...

    Yii 的登录流程

    Yii是一个全栈式的MVC框架,所谓全栈式指的是Yii框架本身实现了web开发中所要用到的所有功能,比如MVC,ORM(DAO/ActiveRecord), 全球化(I18N/L10N), 缓存(caching), 基于jQuery Ajax支持(jQuery-based AJAX support), ...

    yii framework(Yii)框架window版

    Yii是一个基于组件的高性能PHP框架,用于开发大型Web应用。...通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。

    yii2swoole让yii2运行在swoole上

    yii2 swoole:让yii2运行在swoole上 , 运行在swoole上的yii2是运行在php-fpm上yii2的5倍以上

Global site tag (gtag.js) - Google Analytics