`
zjb3165
  • 浏览: 21285 次
  • 性别: 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框架PDF中文文档

    - **版本1.1.2**:新增了一个基于Web的代码生成工具 **Gii** ,极大地提高了开发效率。 - **版本1.1.1**:引入了 **CActiveForm** 组件简化表单编写和表单相关代码的处理,并支持客户端和服务端的一致性验证。 - **...

    YII中文手册

    - **安装与升级**:Yii提供了一个简单易行的安装过程,并且随着新版本的发布,用户可以了解到升级过程中增加的新特性。 - **创建应用**:用户可以根据官方手册快速搭建起自己的第一个Yii应用程序。 - **基本概念**:...

    深入理解Yii2.0 最新版

    Yii2.0是PHP开发领域广泛使用的一个高效、现代的Web应用开发框架。它遵循MVC架构模式,并为快速开发高性能、可扩展的Web应用程序提供了一系列工具和功能。Yii2.0是Yii框架的最新版本,相比旧版,它在性能、灵活性...

    Yii中文手册

    - **CActiveForm**:这是一个新的表单组件,旨在简化表单相关代码的编写,并支持客户端和服务端一致且无缝的数据验证。 - **表单验证**:Yii提供了一套完整的表单验证机制,包括客户端和服务端验证,确保了数据的...

    解析yii数据库的增删查改

    在Yii中,新增数据通常是通过创建一个新的模型对象,设置其属性值,然后调用`save()`方法来完成。例如,在示例中,创建新的`Post`对象并设置`title`和`content`等字段的值,最后调用`save()`保存到数据库。对于更...

    Yii PHP 框架BLOG开发手册

    - **启动测试页面:** 如何运行第一个简单的 Yii 页面以确认一切正常。 - **1.2.3 应用程序工作流程 (Application Workflow)** - **理解请求处理流程:** 详细介绍 Yii 处理 HTTP 请求到生成响应的整个流程。 - ...

    Yii2——使用数据库操作汇总(增删查改、事务)

    例如,如果我们有一个用户模型User,可以通过以下方式创建一个新的用户记录并保存到数据库中: ```php $user = new User(); $user-&gt;name = '新用户'; $user-&gt;email = '***'; $user-&gt;save(); // 保存到数据库 ``` `...

    Yii2 rbac权限控制操作步骤实例教程

    在数据库中创建一个名为`user`的表,用于存储用户信息。接着,使用Yii2的Gii工具生成Model、CRUD(创建、读取、更新、删除)代码,以便对用户数据进行操作。 2. **管理路由(Routes)**: 访问`/admin/route/...

    yii文档有书签版

    - **版本1.1.3**:新增了在应用配置中设置widget默认值的功能,使开发者能够更灵活地控制应用界面元素的呈现方式。 - **版本1.1.2**:引入了基于Web的代码生成工具Gii,极大地简化了开发过程,尤其是对于表单和CRUD...

    关于Yii中模型场景的一些简单介绍

    在Yii中模型字段验证有一个场景的概念,可以在不同的场景下设置不同的验证规则,在Yii中的场景默认为default,简单实现如下 下面我以用户表,表中字段为user_name,password 简单规则如下 public function rules() { ...

    Yii2 批量插入、更新数据实例

    在Yii2框架中进行数据的批量插入和更新是一个常见的操作,尤其在处理大量数据时,能极大提升数据处理效率。 在Yii2中进行批量插入通常使用`batchInsert()`方法,而批量更新则通过模型的`updateAll()`或`...

    Yii2 rbac权限控制之rule教程详解

    在这篇教程中,首先提出了一个问题,为何在使用Yii2构建后台并实现RBAC权限控制的实例教程中没有涉及到rule表。确实,在很多情况下,直接使用角色和权限足以满足需求,但有时候我们需要更细粒度的控制。例如,需要...

    yii实现创建验证码实例解析

    CaptchaAction通常用于控制器中,负责生成验证码图片,并在用户提交表单时进行验证。Captcha组件提供一个可以在视图中显示的验证码图片,并配合CaptchaAction进行用户输入的校验。 3. 配置CaptchaAction:在...

    YiiPiN社会化电商分享系统 v1.3.zip

    关注杂志,通过关注一个杂志,当该杂志有新增的分享时,用户将在“我的首页”和右上角“消息”处收到更新通知; 关注用户,通过关注一个用户,可自动关注其所有的杂志、分享; 搜索,可以搜索分享、用户、杂志等; ...

    Yii 2.0中场景的使用教程

    还有种情况,也是我们现在用到的,同一张表(同一个model)有可能在不同的项目分支中使用,但是不用的项目分支对成员变量的验证是不一样的,这时使用场景就可以轻松搞定; 场景使用 1、Yii2中简单的场景使用在这里有...

    yii2-formwizard:一个Yii2插件,用于使用yii \ widgets \ ActiveForm和\ yii \ db \ ActiveRecord创建步进式表单或表单向导

    一个Yii2插件,用于使用yii\widgets\ActiveForm和\yii\db\ActiveRecord创建步进式表单或表单向导,它使用来创建使用3个内置和3个其他主题的表单界面,此外,您还可以创建自己的表单也有自己的定制主题。 注意:它...

Global site tag (gtag.js) - Google Analytics