- 浏览: 446101 次
- 性别:
- 来自: 茂名
-
文章分类
最新评论
-
zenmshuo:
不错不错,总结的很详细,不知道这个控件和FlexGrid比起来 ...
jQuery EasyUI教程之datagrid应用(三) -
我是你们的爹:
文章里太多错误了,容易误导新手
jQuery EasyUI教程之datagrid应用(三) -
我是你们的爹:
...
jQuery EasyUI教程之datagrid应用(一) -
zhehen123:
你傻啊,json_decode后面跟一个参数就可以转成普通数组 ...
如何将PHP对象数组转换成普通数组? -
lai3221:
hegz,为什么做了没有任何效果呢?
jQuery EasyUI教程之datagrid应用(二)
有些刚接触FleaPHP的童靴对于用户权限管理有些摸不着头脑,不得其门而入。其实,这个也不是什么难事,大家跟着我一步一步去做就行了。做完之后,如果还是不得要领,就不是你们的问题,而是我的水平有问题了。总之,有问题大家多扔几块砖头就是了,我这个人经常锻炼,身体比较抗糙。
闲话休赘,转入正题。
第一步:数据表准备
第一步自然是先创建好相关数据表。一般情况下,我们用到的数据表主要有:roles
(角色表)、users
(用户表)、users_roles
(用户角色中间表)。
1、创建roles表,其表结构及数据如下图所示:
2、创建users表,其表结构如下图所示:
其中的uquota
、logontime
、enable
等字段在你的项目中未必用到,但其中的uid
、username
、password
字段则必须要有。
还有,必须注意其中的password
字段的长度,设为64
位,是由于我使用了PWD_CRYPT
方式加密密码(这也是默认的加密方式),如果使用PWD_MD5
加密方式,设为32
位就行了。
当然还有PWD_CLEARTEXT
、PWD_SHA1
、PWD_SHA2
等其它的加密方式,但由于平时少用,就不要理它了。
如果需要设置为其它非默认的加密方式,可以在保存用户数据前显式指明,如下所示:
$table->$encodeMethod = PWD_MD5;
3、创建users_roles中间表,其表结构如下图所示:
这样,创建好相关数据表后,就可以进行第二步了。
第二步:编写数据表对象代码
1、编写roles数据表对象代码,如下所示:
<?php FLEA::loadClass('FLEA_Rbac_RolesManager'); /** * 角色数据表对象 */ class Table_Roles extends FLEA_Rbac_RolesManager { var $tableName = 'roles'; var $primaryKey = 'role_id'; } ?>
注意:角色数据表对象Table_Roles
是继承父类FLEA_Rbac_RolesManager
的。
2、编写users数据表对象代码,如下面所示:
<?php FLEA::loadClass('FLEA_Rbac_UsersManager'); /** * 用户数据表对象 */ class Table_Users extends FLEA_Rbac_UsersManager { var $tableName = 'users'; var $primaryKey = 'uid'; /** * 定义多对多关联 * * @var array */ var $manyToMany = array( 'tableClass' => 'Table_Roles', 'mappingName' => 'roles', 'joinTable' => 'users_roles', 'fields' => 'role_id, rolename, rolename_cn', // 只读取role_id, rolename, rolename_cn字段数据 'enable' => false, ); } ?>
注意:用户数据表对象Table_Users
是继承父类FLEA_Rbac_UsersManager
的。
另,用户数据表users
与角色数据表roles
定义为多对多的关系,这个应该没有疑问吧?难道不是吗?
下面进行第三步,数据模型对象代码的编写。
第三步:编写数据模型对象代码
众所周知,FleaPHP是一个MVC框架,业务逻辑代码在数据模型对象中实现,这是一个标准,也是一个建议。当然业务逻辑代码也可在其它地方实现,但在此不推荐。
1、编写角色数据模型对象代码,如下所示:
<?php /** * 角色模型对象 */ class Model_Roles { var $_tbRoles; /** * 构造器 * */ function Model_Roles() { $this->_tbRoles = & FLEA::getSingleton('Table_Roles'); } /** * 构造角色多选框 * * 指派用户多个角色时使用 * @param int $selected 选定项 * @return string 返回html代码 */ function makeRoleCheckboxgroups($selected = null) { $ui = & FLEA::initWebControls(); //FLEA::loadFile('FLEA_Helper_Array.php'); $sort = '`role_id` ASC'; $rows = $this->_tbRoles->findAll(null, $sort); //dump($rows); //exit; $items = array_to_hashmap($rows, 'rolename_cn', 'role_id'); return $ui->control( 'checkboxgroup', // 控件类型,指示构造多选框 'roles', // 多选框名称及ID array( 'items' => $items, // 多选框数据项 'selected' => $selected, // 已选项 'multirow' => false, // 是否显示多行 'cols' => 3, // 每行显示3列 'table' => false, // 是否输出表格 //'class' => "radio", // 自定义样式 ), true ); } /** * 构造角色单选框 * * 指派用户单一角色时使用 * @param int $selected 选定项 * @return string 返回html代码 */ function makeRoleRadiogroups($selected = null) { $ui = & FLEA::initWebControls(); //FLEA::loadFile('FLEA_Helper_Array.php'); $sort = '`role_id` ASC'; $rows = $this->_tbRoles->findAll(null, $sort); //dump($rows); //exit; $items = array_to_hashmap($rows, 'rolename_cn', 'role_id'); return $ui->control( 'radiogroup', // 控件类型,指示构造单选框 'roles[]', // 单选框名称及ID array( 'items' => $items, // 单选框数据项 'selected' => $selected, // 已选项 'multirow' => false, // 是否显示多行 'cols' => 3, // 每行显示3列 'table' => false, // 是否输出表格 //'class' => "radio", // 自定义样式 ), true ); } }
注意上面代码中构造多选框的makeRoleCheckboxgroups()
方法和构造单选框的makeRoleRadiogroups()
方法的名称 roles
,这是用户数据表对象中users_roles
中间表的映射名。还要注意两者的区别,一个为 roles
,一个 roles[]
。这样做是有理由的,其理由将在后面说明。
2、编写用户数据模型对象代码,如下所示:
<?php /** * 用户模型对象 */ class Model_Users { var $_tblUsers; /** * 构造函数 * */ function Model_Users() { $this->_tblUsers = & FLEA::getSingleton('Table_Users'); } /** * 保存数据 * * @param array $row * @param Boolean $enableLink * @return int */ function save(& $row, $enableLink = true) { if ($enableLink) { $this->_tblUsers->enableLink('roles'); } return $this->_tblUsers->save($row); } /** * 读取单条数据记录 * * @param string $conditions * @return array */ function find($conditions) { return $this->_tblUsers->find($conditions); } /** * 删除记录 * * @param array $condtion */ function remove($condtion) { $this->_tblUsers->enableLink('roles'); $this->_tblUsers->removeByConditions($condtion); } /** * 更新密码 * * @param string $username * @param string $newPassword * return Bools */ function updatePassword($username, $newPassword) { return $this->_tblUsers->updatePassword($username, $newPassword); } /** * 处理用户列表数据 * * @param unknown_type $rows * @return unknown */ function getAdminUsersList(& $rows) { $i=0; foreach ($rows as $row) { $rows[$i]['xh'] = $i + 1; $rows[$i]['uquota'] = round($row['uquota']/(1024*1024), 2); $rows[$i]['status'] = ($row['enable'])?"<font color=\"#FF0000\">已激活</font>":"未激活"; $rows[$i]['isOpen'] = ($row['enable']) ? 0 : 1; $recs = $row['roles']; $rls = array(); foreach ($recs as $rec) { $rls[] = $rec['rolename_cn']; } $rows[$i]['rls'] = implode(', ', $rls); $i++; } return $rows; } /** * 构造用户状态单选框 * * @param int $selected * @return 返回HTML代码 */ function makeEnableUserRadiogroups($selected = null) { $ui = & FLEA::initWebControls(); $items = array( '激活' => 1, '不激活' => 0, ); return $ui->control( 'radiogroup', 'enable', array( 'items' => $items, 'selected' => $selected, 'multirow' => false, //'cols' => 3, 'table' => true, ), true ); } } ?>
第四步:编写HTML模板代码
下面的代码为与分派角色相关的部分代码。
...... <tr> <th>分派角色:</th> <td>{{$user.html_roles}}</td> </tr> ......
第五步:编写用户管理控制器类代码
由于用户管理控制器类代码太长,因此只节选部分相关代码:
<?php /** * 办公网站后台管理——用户管理控制器类 * * 文 件 名:Admin/Controller/Users.php * 作 者:hegz * 更新时间:2010/05/08 * */ /** * 装入后台管理控制器基类 */ //{{ FLEA::loadClass('Controller_AdminBase'); //}} class Controller_Users extends Controller_AdminBase { /** * 构造函数 * * @return Controller_Default */ function Controller_Users() { parent::Controller_AdminBase(); $this->_modelUsers = & FLEA::getSingleton('Model_Users'); $this->_modelRoles = & FLEA::getSingleton('Model_Roles'); } /** * 缺省操作 * */ function actionIndex() { ...... } /** * 显示增加用户界面操作 * */ function actionAdd() { $data = array(); ...... // 单角色 $data['html_roles'] = $this->_modelRoles->makeRoleRadiogroups(4); // 多角色 //$data['html_roles'] = $this->_modelRoles->makeRoleCheckboxgroups(4); ...... $this->tpl->assign('user', $data); $this->display('user_add_edit.tpl'); } /** * 保存数据 * */ function actionSave() { $data = $_POST; $data['password'] = '123456'; ...... //$data['roles'][0] = $data['role_id']; // 准备角色数据 //dump($data); // 显示提交到后台的数据 //exit; $this->_modelUsers->save($data); redirect($this->_url()); } /** * 显示用户编辑界面操作 * */ function actionEdit() { $conditions = array( array('uid', (int)$_GET['id'], '='), ); $data = $this->_modelUsers->find($conditions); ...... /** * 多角色 */ /*$roles = $data['roles']; $roleIds = array(); foreach ($roles as $role) { $roleIds[] = $role['role_id']; } $data['html_roles'] = $this->_modelRoles->makeRoleCheckboxgroups($roleIds);*/ // 单一角色 $data['html_roles'] = $this->_modelRoles->makeRoleRadiogroups($data['roles'][0]['role_id']); ...... $this->tpl->assign('user', $data); $this->display('user_add_edit.tpl'); } ...... } ?>
用户管理控制器类构造完毕后,就可以运行程序进行测试了。
程序生成的界面效果图如下:
把用户控制器类的代码修改为:
/** * 显示增加用户界面操作 * */ function actionAdd() { ...... // 单角色 //$data['html_roles'] = $this->_modelRoles->makeRoleRadiogroups(4); // 多角色 $data['html_roles'] = $this->_modelRoles->makeRoleCheckboxgroups(4); ...... }
在增加用户时将可分派多角色,如下图所示:
数据测试
增加如图所示用户:
提交后,将得到如下数据:
查看提交数据
去掉用户管理控制器类actionSave
方法中:
//dump($data); //exit;
这两句代码前面的双斜线,直接点击增加按钮提交数据,得到的数据如下所示:
(
[username] =>
[uid] =>
[name] =>
[gid] => 1
[roles] => Array
(
[0] => 4
)
[uquota] => 314572800
[enable] => 0
[save] => 增 加
[password] => 123456
)
(
[username] =>
[uid] =>
[name] =>
[gid] => 1
[roles] => Array
(
[0] => 2
[1] => 4
)
[uquota] => 314572800
[enable] => 0
[save] => 增 加
[password] => 123456
)
注意上面的roles
数据,这是一个二维数组。不知童靴们是否记得,前面我曾说过,roles
为用户数据表对象中users_roles
中间表的映射名称。只有将这样格式的二维角色数组数据传入save()
方法,才能正确处理角色关联数据。这就是在角色模型对象中,将多选框及单选框控件的控件名设置为roles的原因。
如果多选框及单选框控件的控件名不是设置为roles
,比如设置为role_id
,为了保证能够正确处理角色关联数据,则在将数据传入save()
中时,必须先进行处理。如下所示:
$data['roles'][0] = $data['role_id']; // 准备角色数据
结束语
用户权限的管理先介绍到这里吧。水平所限,错漏实所难免。总而言之,有错误的地方,欢迎指正,有不明白的地方,请提出来。或者日后有需要补充的地方,我将及时进行补充。
论坛贴:http://qeephp.com/bbs/viewthread.php?tid=10972&page=1&extra=#pid56703
发表评论
-
FleaPHP分页方法讲解
2010-05-22 15:42 1639本来这篇文章是不想写的,要写早几年就应该写了,为甚么突然想起要 ... -
在xheditor编辑器的WYSWYG编辑模式下增加插入代码功能
2010-05-18 13:56 3174xhEditor HTML编辑器为国人所开发,是一个基于jQu ... -
类javaeye博客我的收藏页面中分类标签输入功能的实现
2010-05-09 01:08 2635javaeye博客的收藏管理页面,收藏分类是通过下拉列表选择来 ... -
FleaPHP全部版本源代码下载
2010-04-21 19:40 1011下载地址: http://old.fleaphp.or ... -
FleaPHP的单入口文件详解
2010-04-18 11:34 3947论坛贴:http://qeephp.com/bbs/threa ... -
FLEA_Rbac_UsersManager 类中的fetchRoles()方法的bug修正
2010-04-09 16:43 1005影响版本:1.7.1524及早期版本。 原有代码在 P ... -
FleaPHP 1.0.70 开发进度汇报专贴
2010-04-06 22:09 1515这个帖子虽然比较旧,但仔细找找,你很可能挖到金矿也不一定。 ... -
FleaPHP与Fpdf结合,创建PDF文档
2010-04-06 20:59 2347应本地交警部门的请求,开发 了一个利用交警部门导出的缴款 ... -
FleaPHP数据关联
2010-03-30 21:17 1155$belongsTo 定义从属关 ... -
FleaPHP中如何捕获异常?
2010-03-30 00:09 889兼容PHP4: __TRY(); $newsCont ... -
FleaPHP页面数据缓存
2010-03-29 23:58 1107dualface : FleaPHP 的视图缓存论坛里 ... -
直接利用findAll进行分页查询(限定结果集查询)
2010-03-29 23:51 1762findAll是 FLEA_Db_TableDataGatew ... -
FLEA/Helper/Array.php中array_to_tree的用法
2010-03-29 23:19 1999FLEA/Helper/Array.php中的array_to ...
相关推荐
- 实现RBAC权限管理的具体方法。 5. **模板应用篇** - Smarty模板引擎功能和设置讲解。 - 将Ajax功能与Smarty模板结合的方法。 6. **Ajax及WebControls操作篇** - FleaPHP中的Ajax类介绍。 - WebControls的...
1. 帖子管理:用户可以浏览、发表帖子,管理员则能修改或删除帖子。 2. 帖子回复管理:用户可以回复帖子,查看回复信息,管理员可修改或删除回复。 3. 用户管理:用户可以注册、修改个人信息,管理员可以管理用户...
最后,本书还会提供实际项目开发的案例,让读者在实践中巩固所学知识,包括用户注册、登录、权限管理等常见功能的实现。这些案例将涵盖完整的开发流程,帮助读者将理论知识转化为实际技能。 总之,《Fleaphp开发...
- FleaPHP提供了内置的RBAC组件,开发者可以通过配置角色和权限来管理用户的访问权限。 #### A1. 升级FleaPHP - **步骤**: - 检查最新版本。 - 下载并替换旧版本文件。 - 更新配置文件。 #### A2. 使用PATH...
6. **apmxe.manifest**:应用程序清单文件,描述了程序所需的运行时环境和权限,例如对于Windows Vista及更高版本,它可能包含UAC(用户账户控制)的相关设置。 7. **apmxe.rc**:资源脚本文件,用于定义和管理应用...
9. 探索THINKPHP的RBAC(Role-Based Access Control)机制,实现基于角色的权限控制,为用户提供安全的访问控制。 10. 通过实例项目,如CMS内容管理系统或学生学籍管理系统,将理论知识应用于实践中,提升实际开发...