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的授权了
分享到:
相关推荐
在本篇详解中,我们将深入探讨在Yii框架中新增一个用户验证方法的过程,并且涵盖与用户登录验证、授权以及退出相关的各个方面。 首先,新增用户验证的原因通常是为了满足应用中不同模块(比如后台和前台)对用户...
- **版本1.1.2**:新增了一个基于Web的代码生成工具 **Gii** ,极大地提高了开发效率。 - **版本1.1.1**:引入了 **CActiveForm** 组件简化表单编写和表单相关代码的处理,并支持客户端和服务端的一致性验证。 - **...
- **安装与升级**:Yii提供了一个简单易行的安装过程,并且随着新版本的发布,用户可以了解到升级过程中增加的新特性。 - **创建应用**:用户可以根据官方手册快速搭建起自己的第一个Yii应用程序。 - **基本概念**:...
Yii2.0是PHP开发领域广泛使用的一个高效、现代的Web应用开发框架。它遵循MVC架构模式,并为快速开发高性能、可扩展的Web应用程序提供了一系列工具和功能。Yii2.0是Yii框架的最新版本,相比旧版,它在性能、灵活性...
- **CActiveForm**:这是一个新的表单组件,旨在简化表单相关代码的编写,并支持客户端和服务端一致且无缝的数据验证。 - **表单验证**:Yii提供了一套完整的表单验证机制,包括客户端和服务端验证,确保了数据的...
在Yii中,新增数据通常是通过创建一个新的模型对象,设置其属性值,然后调用`save()`方法来完成。例如,在示例中,创建新的`Post`对象并设置`title`和`content`等字段的值,最后调用`save()`保存到数据库。对于更...
- **启动测试页面:** 如何运行第一个简单的 Yii 页面以确认一切正常。 - **1.2.3 应用程序工作流程 (Application Workflow)** - **理解请求处理流程:** 详细介绍 Yii 处理 HTTP 请求到生成响应的整个流程。 - ...
例如,如果我们有一个用户模型User,可以通过以下方式创建一个新的用户记录并保存到数据库中: ```php $user = new User(); $user->name = '新用户'; $user->email = '***'; $user->save(); // 保存到数据库 ``` `...
在数据库中创建一个名为`user`的表,用于存储用户信息。接着,使用Yii2的Gii工具生成Model、CRUD(创建、读取、更新、删除)代码,以便对用户数据进行操作。 2. **管理路由(Routes)**: 访问`/admin/route/...
- **版本1.1.3**:新增了在应用配置中设置widget默认值的功能,使开发者能够更灵活地控制应用界面元素的呈现方式。 - **版本1.1.2**:引入了基于Web的代码生成工具Gii,极大地简化了开发过程,尤其是对于表单和CRUD...
在Yii中模型字段验证有一个场景的概念,可以在不同的场景下设置不同的验证规则,在Yii中的场景默认为default,简单实现如下 下面我以用户表,表中字段为user_name,password 简单规则如下 public function rules() { ...
在Yii2框架中进行数据的批量插入和更新是一个常见的操作,尤其在处理大量数据时,能极大提升数据处理效率。 在Yii2中进行批量插入通常使用`batchInsert()`方法,而批量更新则通过模型的`updateAll()`或`...
在这篇教程中,首先提出了一个问题,为何在使用Yii2构建后台并实现RBAC权限控制的实例教程中没有涉及到rule表。确实,在很多情况下,直接使用角色和权限足以满足需求,但有时候我们需要更细粒度的控制。例如,需要...
CaptchaAction通常用于控制器中,负责生成验证码图片,并在用户提交表单时进行验证。Captcha组件提供一个可以在视图中显示的验证码图片,并配合CaptchaAction进行用户输入的校验。 3. 配置CaptchaAction:在...
关注杂志,通过关注一个杂志,当该杂志有新增的分享时,用户将在“我的首页”和右上角“消息”处收到更新通知; 关注用户,通过关注一个用户,可自动关注其所有的杂志、分享; 搜索,可以搜索分享、用户、杂志等; ...
还有种情况,也是我们现在用到的,同一张表(同一个model)有可能在不同的项目分支中使用,但是不用的项目分支对成员变量的验证是不一样的,这时使用场景就可以轻松搞定; 场景使用 1、Yii2中简单的场景使用在这里有...
一个Yii2插件,用于使用yii\widgets\ActiveForm和\yii\db\ActiveRecord创建步进式表单或表单向导,它使用来创建使用3个内置和3个其他主题的表单界面,此外,您还可以创建自己的表单也有自己的定制主题。 注意:它...