Yii系列-03:用户管理
这是一个应用所应具有的基本功能之一,不用从零开发。Yii Extensions有现成的东西直接可用,或者在其基础上进行定制。
以Yii-User
Module为例。该扩展Module用于用户注册与管理。有用户注册、账号激活、密码修复、profile配置、用户CRUD功能。使用方法参见官网上的Yii-User extension。
1 数据表结构
该module的维护的用户数据有三张数据表,如下图:
users表为基本表,profiles表中的字段数由profiles_fields表动态生成。
通过UI维护profiles_fields表中的数据,详细定义了每个profile的名称、类型、验证、缺省等,运行时根据该表的CRUD操作对profiles的结构进行通过ALTER TABLE等语句重新重构。
2 登录流程
首先,yii framework将 login请求转发到 yii user module,后者接管login流程,验证后,设置必要的状态并redirect返回。如图:
首先,yii framework将 login请求转发到 yii user module,后者接管login流程,验证后,设置必要的状态并redirect返回。如图:
需要说明以下几点:
- 流程涉及framework和module两部分,左边蓝色两个类属于yii framework,右边黄色四个类属于Yii User Module。
- 对于CWebUser的loginUrl的初始化值在protected/config/main.php中设置,参阅上篇文章,设为“user/login”,通过 urlManager 指向了User Module的Login Controller,该Controller中的defaultAction为login(步骤2)。
- UserIdentity扩展自framework的CBaseUserIdentity,验证username(或者email)、password正确后,设置_id和username属性。
- 登录成功后,UserLogin调用CWebUser的login方法,并将UserIdentity实例作为参数一并传递。CWebUser作为 CWebApplication的属性,设置id、name、state等,这些信息在整个application范围内可通过 Yii::app()->user访问。
如果要对该流程进行定制,有两个地方是最佳的扩展点。
- 在Session中设置User信息:UserIdentity验证通过后,此时该实例拥有User对象,可通过setState方法设置User的其他 信息,该信息随后经CWebUser的login方法处理进入session,可通过Yii::app()->user获取。
- login成功的后续操作:UserLogin调用CWebUser的login方法之后,此时成功login流程已走完,可在此追加记录用户登录IP、发送email、系统检查等其他操作。
通过tbl_users表中的supperuser属性,可标记用户是否属于administrator。
程序中通过Yii::app()->findModule("user")->isAdmin()来判断。
当然通过这种方式定义角色是比较简单的。yii 社区还有其他的module,专门解决角色及访问控制问题的。