- <span style="font-family:Arial, Helvetica, sans-serif;background-color:rgb(255,255,255);">在这个项目设计之前,老板要求使用权限设计,我比较了一些设计方式,感觉都不错,于是综合了一下,自己写一种权限管理</span>
在权限这一块出于安全性考虑,我验证的比较复杂,或许存在不足,如有意见可以交流
一: 管理员表(如下图)
- 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 ,当然权限问题是通用的,和框架没太大关系
代码如下
- <?php
- namespace 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 这是解密函数,在前面的文章中有此介绍 <a href="http://blog.csdn.net/fei003/article/details/66472358" target="_blank">http://blog.csdn.net/fei003/article/details/66472358</a> ,
对权限进行初步验证,此时访问链接的话,会拒绝并跳转 ,但是如何在页面中实现权限呢,就是说没有权限的菜单不会显示
- <span style="font-family:Arial, Helvetica, sans-serif;"> </span><span style="font-family:Arial, Helvetica, sans-serif;"> <span> </span>// 对角色进行管理</span>
- // 得到对应的角色以及权限
- $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);