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

 更新时间:2013年06月20日 10:47:06   作者:  
本篇文章是对在yii中新增一个用户验证的方法进行了详细的分析介绍,需要的朋友参考下
1.为什么要新增一个用户验证:
因为我要将网站后台和前台做在同一个yii的应用中.但是前台也包含有会员的管理中心.而这两个用户验证是完全不同的,所以需要两个不同登陆页面,要将用户信息保存在不同的cookie或session中.所以需要在一个应用中增加一个用户验证

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

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; 
    } 
}

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

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

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

// 注销当前用户 
Yii::app()->user->logout();
 其中的user是yii的一个components.需要在protected/config/main.php中定义

Php代码
复制代码 代码如下:

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

这里我们没有指定user的类名.因为在yii中默认user为CWebUser类的实例.
我 们现在已经实现了用户的登陆验证和退出.但是现在无论是否登陆,用户都能访问所有的action,所以下一步我们要对用户访问进行授权.在yii里是通过 Access Control Filter即访问控制过滤器来实现用户授权的.我们看一下一个简单的带有访问控制的Controller:
Php代码
复制代码 代码如下:

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方法:
Php代码
复制代码 代码如下:

public function filterAccessControl($filterChain) 

    $filter=new CAccessControlFilter; 
    $filter->setRules($this->accessRules()); 
    $filter->filter($filterChain); 
}

在里面新建了一个CAccessControlFilter实例,并且在setRules时传入了accessRules()方法返回的参数.
$filter->filter($filterChain)则是继续调用其它filter.
而所有具体的授权规则则是定义在accessRules中:
Php代码
复制代码 代码如下:

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:
Php代码
复制代码 代码如下:

class CAdminWebUser extends CWebUser 

    public $loginUrl = array('admin/admin/login'); 
}

我们需要把他放置到components中
如果是全局应用则通过protected/config/main.php的components小节:
Php代码
复制代码 代码如下:

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

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

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

最后调用方式
Php代码
复制代码 代码如下:

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

但仅仅这样还不够,我们还需要修改Controller的filter,我们需要自定义一个filter,来实现另一个用户的验证和授权
第一步自定义一个filter:
Php代码
复制代码 代码如下:

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方法
Php代码
复制代码 代码如下:

public function filterAccessControl($filterChain) 

    $filter = new CAdminAccessControlFilter(); 
    $filter->setRules($this->accessRules()); 
    $filter->filter($filterChain); 

//在这里我们使用自定义的filter类替换了原来的filter

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

相关文章

  • 用PHP调用Oracle存储过程的方法

    用PHP调用Oracle存储过程的方法

    php程序访问数据库,完全可以使用存储过程,有人认为使用存储过程便于维护。不过仁者见仁,智者见智,在这个问题上,偶认为使用存储过程意味着必须要dba和开发人员更紧密配合,如果其中一方更变,则显然难以维护。
    2008-09-09
  • php对字符串中的特殊符号进行过滤的方法

    php对字符串中的特殊符号进行过滤的方法

    有时候我们会遇到过滤字符串中特殊字符的问题,本文提供了三个处理特殊字符串的方法,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • php中出现空白页的原因及解决方法汇总

    php中出现空白页的原因及解决方法汇总

    这篇文章主要介绍了php中出现空白页的原因及解决方法汇总,对于PHP程序开发人员来说很有参考借鉴价值,需要的朋友可以参考下
    2014-07-07
  • 解析php扩展php_curl.dll不加载的解决方法

    解析php扩展php_curl.dll不加载的解决方法

    本篇文章是对php扩展php_curl.dll不加载的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php中namespace use用法实例分析

    php中namespace use用法实例分析

    这篇文章主要介绍了php中namespace use用法,结合实例形式分析了PHP中命名空间的定义与使用技巧,需要的朋友可以参考下
    2016-01-01
  • 让PHP以ROOT权限执行系统命令的方法

    让PHP以ROOT权限执行系统命令的方法

    这种问题我想大家可能都遇到过,网友提供的解决方法也很多。我也只是结合自己系统的需求并结合网友的解决方案来总结的一种方法
    2011-02-02
  • PHP5中虚函数的实现方法分享

    PHP5中虚函数的实现方法分享

    学过C++的人都应该知道C++中有个虚函数的概念。而在php5中如何实现这个虚函数呢?
    2011-04-04
  • CodeIgniter php mvc框架 中国网站

    CodeIgniter php mvc框架 中国网站

    CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为 PHP 程序员建立功能完善的 Web 应用程序。如果你是一个使用共享主机,并且为客户所要求的期限而烦恼的开发人员,如果你已经厌倦了那些傻大笨粗的框架
    2008-05-05
  • Sorting Array Values in PHP(数组排序)

    Sorting Array Values in PHP(数组排序)

    有时候,你可能需要对数组内的值进行排序,那么就可以参考下面的文章。
    2011-09-09
  • Youku 视频绝对地址获取的方法详解

    Youku 视频绝对地址获取的方法详解

    本篇文章是对Youku 视频绝对地址获取的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论