`
dcj3sjt126com
  • 浏览: 1877888 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简单的用户授权系统,利用给user表添加一个字段标识管理员的方式

    博客分类:
  • YII
yii 
阅读更多

怎么创建一个简单的(非 RBAC)用户授权系统

通过查看论坛,我发现这是一个常见的问题,所以我决定写这篇文章。

本文只包括授权系统.假设你已经知道怎么创建身份验证系统(登录)。

数据库

首先在 user 表创建一个新的字段(integer 类型),字段名 'accessLevel',它定义了用户的访问权限

扩展 CWebUser 类

在配置文件(一般为 protected/config/main.php)中添加(或修改为)以下代码

'components'=>array(
  'user'=>array(
    //告诉应用程序使用自己的 WebUser 类,而不是默认的 CWebUser
    'class'=>'WebUser',
    //...
  ),
),

在组件文件夹(protected/components)中,创建 WebUser.php 文件,内容为

class WebUser extends CWebUser{
 private $_user;
 //是用户还是超级管理员?
 function getIsSuperAdmin(){
  return ( $this->user && $this->user->accessLevel === User::LEVEL_SUPERADMIN );
 }
 //该用户是否为管理员?
 function getIsAdmin(){
  return ( $this->user && $this->user->accessLevel >= User::LEVEL_ADMIN );
 }
 //获取登录用户
 function getUser(){
  if( $this->isGuest )
   return;
  if( $this->_user === null ){
   $this->_user = User::model()->findByPk( $this->id );
  }
  return $this->_user;
 }
}

用法

现在可以在 accessControl 过滤器(filter) 中来验证用户了

//在控制器中
function accessRules(){
  return array(
    //只有管理员可以访问
    array('allow',
      'expression'=>'$user->isAdmin',
       //变量 `user` 在访问规则(accessRule)表达式中表示的是 Yii::app()->user
    ),
    //deny all other users
    array('deny',
      'users'=>array('*').
    ),
  );
}

在视图中使用

if(Yii::app()->user->isAdmin){
   echo '欢迎,管理员!';
}
if(Yii::app()->user->isSuperAdmin){
   echo '你是超级管理员!';
}

数据表示

在用户名模型中(User Model),整型的那个字段的数据用以下方式表达

class User extends CActiveRecord{
 //define the number of levels that you need
 const LEVEL_REGISTERED=0, LEVEL_AUTHOR=1, LEVEL_ADMIN=6, LEVEL_SUPERADMIN=99;
 
 //define the label for each level
 static function getAccessLevelList( $level = null ){
  $levelList=array(
   self::LEVEL_REGISTERED => 'Registered',
   self::LEVEL_AUTHOR => 'Author',
   self::LEVEL_ADMIN => 'Administrator'
  );
  if( $level === null)
   return $levelList;
  return $levelList[ $level ];
 }
}
//using it in forms
$form->dropDownList($model,'accessLevel',$model->accessLevelList);
//using it in DetailView
$this->widget('zii.widgets.CDetailView',array(
  'data'=>$model,
  'attributes'=>array(
   //...,
   array(
    'name'=>'accessLevel',
    'value'=>$model->accessLevelList[$model->accessLevel],
   ),
  ),
));
//using it in GridView
$this->widget('zii.widgets.CGridView',array(
  'dataProvider'=>$model->search(),
  'columns'=>array(
   //...,
   array(
    'name'=>'accessLevel',
    'value'=>'$data->accessLevelList[$data->accessLevel]',
   ),
  ),
));
//display the administrator label 
echo User::getAccessLevelList( User::LEVEL_ADMIN );

以上就是所有内容,希望这对你有所帮助。

本文翻译自外文网站,查看原文请点击:http://www.yiiframework.com/wiki/191/implementing-a-user-level-access-system/
分享到:
评论
2 楼 dcj3sjt126com 2013-02-27  
srbac我看到有个项目里面实现了,现在研究研究他写的程序
1 楼 duchengbin 2013-02-27  
太帅

相关推荐

    基于JAVA的图书管理系统方案.doc

    6. **界面和交互**:系统应提供友好的用户界面,方便管理员和读者进行各种操作,如图形化界面(GUI)或Web界面,支持数据的输入验证和错误处理。 7. **安全性**:系统需要确保数据的安全,例如通过加密技术保护用户...

    第9章 后台管理.ppt

    管理员和普通用户共享同一张User表,区别在于Rank字段,后台管理员的Rank值为2,普通用户为1。登录时,需要在代码中针对Rank字段进行判断,以区分不同类型的用户。 **3. 图书类别管理** - **添加类别**:通过创建新...

    ecshop支付宝快捷登陆接口

    值得注意的是,这个插件宣称无需在ECSHOP的`user`表中添加额外字段。这意味着它可能采用了某种方式,如关联表或隐藏字段,来存储用户在支付宝的唯一标识,而不会改变原有数据库结构。这样可以避免对现有数据模型造成...

    mysql参考手册

    本MySQL参考手册详细涵盖了上述内容,旨在为开发者和数据库管理员提供全面的指导,帮助他们更好地管理和利用MySQL数据库。无论是初学者还是经验丰富的专业人士,都能从中受益匪浅。通过学习和实践,你可以精通MySQL...

    ibm portal 用户&组注册开发文档

    在IBM Portal中,用户注册过程主要依赖于WebSphere Member Management (WMM),这是一个灵活的成员管理框架,能够处理各种来源的身份信息,如数据库或LDAP(轻量级目录访问协议)。当新用户提交注册信息时,WMM根据其...

    微软活动目录管理管理简明手册

    活动目录中的每个域利用DNS(Domain Name Server,域名服务)域名加以标识,并且需要一个或多个域控制器。如果用户的网络需要一个以上的域,则用户可以创建多个域。共享相同的公用架构和全局目录的一个或多个域称为域...

    challenge599:用于健康催化剂

    在`UserService`中,定义一个`DeleteUser`方法,接收用户的唯一标识(如用户ID)作为参数。执行对应的SQL DELETE语句来删除指定的用户记录。为了防止误删,可以在操作前提示用户确认,或者提供回收站功能,让用户有...

    devise_implementation:学习实现多帐户登录的设计

    Devise是一个强大的、灵活的身份验证解决方案,专门为Ruby on Rails框架设计。它允许开发者轻松地集成用户认证系统,包括注册、登录、密码重置等常见功能。在这个“devise_implementation”项目中,我们将深入探讨...

Global site tag (gtag.js) - Google Analytics