php通用权限管理设计

来源:互联网 发布:php服务端开发 编辑:程序博客网 时间:2024/06/12 15:19

在这个项目设计之前,老板要求使用权限设计,我比较了一些设计方式,感觉都不错,于是综合了一下,自己写一种权限管理


在权限这一块出于安全性考虑,我验证的比较复杂,或许存在不足,如有意见可以交流


一: 管理员表(如下图)

CREATE TABLE `czl_admin` (  `adid` int(11) NOT NULL AUTO_INCREMENT,  `adname` varchar(20) NOT NULL,  `password` varchar(32) NOT NULL,  `addlogip` varchar(18) NOT NULL DEFAULT '127.0.0.1',  `adlogtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `adregtime` int(10) NOT NULL,  `type` tinyint(1) DEFAULT '0',  `rid` tinyint(3) NOT NULL DEFAULT '0',  PRIMARY KEY (`adid`),  UNIQUE KEY `adname` (`adname`)) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

权限表

 CREATE TABLE `czl_power` (  `powerid` tinyint(3) NOT NULL AUTO_INCREMENT,  `controller` varchar(15) NOT NULL,  `action` varchar(15) NOT NULL,  `powername` varchar(15) NOT NULL,  PRIMARY KEY (`powerid`)) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8


如下表

角色表

CREATE TABLE `czl_role` (  `roleid` tinyint(4) NOT NULL AUTO_INCREMENT,  `powerid` varchar(50) NOT NULL,  `rolename` varchar(10) NOT NULL,  PRIMARY KEY (`roleid`)) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8



字段和建表sql如上,

admin表中rid和角色表关联

角色表powerid和权限表关联

角色所属的权限以字符串的形式存放在表中

我使用的是tp3.2 ,当然权限问题是通用的,和框架没太大关系

代码如下

<?phpnamespace Admin\Controller;use Think\Controller;/**张鹏飞*2017.4.1*权限* */class BaseController extends Controller{function _initialize(){$adname = cookie('adname');$adid   = cookie('adid');if (!isset($adid) && !isset($adname)){header('location:'.U('Log/index'));die;}// 登录用户进行再次验证$where = array('adname' => passport_decrypt($adname,C('PASSWORD_KEY')),'adid' => passport_decrypt($adid,C('PASSWORD_KEY')),);$admin = D('Admin');$adminArr = $admin->where($where)->find();if(empty($adminArr)){// 判断是否为合法数据header('location:'.U('Home/Index/index'));die;}// 对角色进行管理// 得到对应的角色以及权限$role = D('role');$roleArr = $role->find($adminArr['rid']);if(empty($roleArr)){// 若没有对应的权限则为非法用户header('location:'.U('Home/Index/index'));die;}$power = D('Power');$powerid = explode('|', $roleArr['powerid']);$where['powerid'] = ':powerid';foreach ($powerid as $k => $v) {$powerTotalArr[] = $power->field('controller,action')->where($where)->bind(':powerid',$v['powerid'])->find();}// 做两层判断// 对路径进行判断$controller = strtolower(CONTROLLER_NAME);$action = strtolower(ACTION_NAME);$flag = false;foreach ($powerTotalArr as $k => $v) {if(strtolower($v['controller']) == $controller && strtolower($v['action']) == $action){$flag = true;}}if(!$flag) exit('您没有权限');// 重组控制器和方法foreach ($powerTotalArr as $k => $v) {if(!in_array($v['controller'],$powerTotalArrStr)) $powerTotalArrStr[] = strtolower($v['controller']);$powerTotalArrStr[] = strtolower($v['controller']).'/'.strtolower($v['action']);}$this->assign('powerTotalArrStr',$powerTotalArrStr);}}

--------------------------------------------------------------------------------------------

以下为分析过程

---------------------------------------------------------------------------------------------

登录之后会存放cookie,这里我对cookie做最基本的判断


if (!isset($adid) && !isset($adname)){header('location:'.U('Log/index'));die;}

这里是对存放的cookie进行验证,防止有人伪造cookie

adid和adname来查数据表

if (!isset($adid) && !isset($adname)){header('location:'.U('Log/index'));die;}

// 登录用户进行再次验证$where = array('adname' => passport_decrypt($adname,C('PASSWORD_KEY')),'adid' => passport_decrypt($adid,C('PASSWORD_KEY')),);$admin = D('Admin');$adminArr = $admin->where($where)->find();if(empty($adminArr)){// 判断是否为合法数据header('location:'.U('Home/Index/index'));die;}




passport_decrypt 这是解密函数,在前面的文章中有此介绍 http://blog.csdn.net/fei003/article/details/66472358 ,



对权限进行初步验证,此时访问链接的话,会拒绝并跳转  ,但是如何在页面中实现权限呢,就是说没有权限的菜单不会显示

// 对角色进行管理
// 得到对应的角色以及权限$role = D('role');$roleArr = $role->find($adminArr['rid']);if(empty($roleArr)){// 若没有对应的权限则为非法用户header('location:'.U('Home/Index/index'));die;




对权限进行重组,并传值到模板中,在这里如果该用户没有此权限,经过判断后则对菜单进行屏蔽处理




foreach ($powerTotalArr as $k => $v) {if(!in_array($v['controller'],$powerTotalArrStr)) $powerTotalArrStr[] = strtolower($v['controller']);$powerTotalArrStr[] = strtolower($v['controller']).'/'.strtolower($v['action']);}$this->assign('powerTotalArrStr',$powerTotalArrStr);


加油  DREAM-FEI




0 0