基于新版SP框架开发的权限类auth

#1 txws2012

本帖最后由 txws2012 于 2018-4-3 21:16 编辑

新年给大家来个开工福利!目前在用新版的sp框架开发一个CMS,但是框架本身没有自带其他类库,就自己弄了一个权限auth类。ps:刚开始想用jake老大发布了CMS系统示例的权限的,但是这个系统的权限有点复杂以及只是对不同用户的后台菜单做了隐藏,知道控制器和动作名称的还是可以直接使用的。

不说了直接上代码(代码有基本注释):
auth.php(放在include目录下)
/**
* 权限类
* @author 风雨 <1342201051@qq.com>
* @copyright www.icms.xin
*/
/*
        -- 表的结构 `i_auth_group`
        CREATE TABLE IF NOT EXISTS `i_auth_group` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限组ID',
          `name` varchar(40) NOT NULL COMMENT '组名称',
          `auths` text COMMENT '组规则',
          `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '用户组状态',
          `remark` varchar(100) DEFAULT NULL COMMENT '组备注',
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='权限组' AUTO_INCREMENT=2 ;
        -- --------------------------------------------------------
        -- 表的结构 `i_auth_group_access`
        CREATE TABLE IF NOT EXISTS `i_auth_group_access` (
          `gid` int(10) unsigned NOT NULL COMMENT '权限组ID',
          `uid` int(10) unsigned NOT NULL COMMENT '用户id',
          PRIMARY KEY (`gid`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户组明细表';
        -- --------------------------------------------------------
        -- 表的结构 `i_auth_rule`
        CREATE TABLE IF NOT EXISTS `i_auth_rule` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID',
          `pid` int(10) NOT NULL,
          `title` varchar(40) NOT NULL COMMENT '权限名称',
          `ico` varchar(100) NOT NULL,
          `controller` varchar(100) NOT NULL COMMENT '控制器名称',
          `action` varchar(100) NOT NULL COMMENT '方法名称',
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='认证规则表' AUTO_INCREMENT=9 ;
        -- --------------------------------------------------------
*/
class Auth{
        //用户UID
        protected $uid;
        //初始化
        public function __construct(){

        }
        //获取权限列表,用于菜单显示
        public function getAuths($uid = null){
                //如果uid=1则取得所有菜单,否则按照权限组取得菜单
                if ($uid == 1) {
                        $auth = M('auth_rule');
                        $auths = $auth->findall();
                }else{
                        $auths = $this->getUserAuths($uid);
                }
                return $this->make_tree($auths);
        }
        //验证权限,不支持参数验证
        public function check($uid = null , $model = 1){
                //uid=1为创始人,不作权限判断
                if ($uid == 1) {
                        return true;
                }
                //获取用户所拥有的权限
                $auths = $this->getUserAuths($uid);
                if(empty($auths)){
                        return false;
                }
                //当前路由
                GLOBAL $__controller, $__action;
        $current = $__controller.'@'.$__action;
                foreach ($auths as $key => $value) {
                        //是否相等
                        if($value['controller'].'@'.$value['action'] == $current){
                                return true;
                        }
                        //数据库找不到,返回true
                        $auth = M('auth_rule');
                        $find['controller'] = $auth->find(array('controller' => $__controller),null,'*');
                        $find['action'] = $auth->find(array('action' => $__action),null,'*');
                        if(!($find['controller'] && $find['action'])){
                                return true;
                        }
                }
        }
        //获取用户权限列表
        protected function getUserAuths($uid = null){
                if(empty($uid)){
                        return false;
                }
                //获取用户的权限组
                $auth_users = M('auth_group_access')->find(array('uid' => $uid),null,'*');
                if(empty($auth_users)){
                        return false;
                }
                //根据权限组查找组权限
                $auth_group = M('auth_group')->find(array('id' => $auth_users['gid']),null,'*');
                //根据权限规则查找对应的权限
                $model = M('auth_rule');
                $sql = "SELECT * FROM {$GLOBALS['mysql']['MYSQL_PRE']}auth_rule
                WHERE id
                IN ({$auth_group['rules']})
                ";
        $auths = $model->query($sql);
                return $auths;
        }
        //转化树状列表
        protected function make_tree($arr){  
            $refer = array();  
            $tree = array();  
            foreach($arr as $k => $v){  
                $refer[$v['id']] = & $arr[$k];
            }  
            foreach($arr as $k => $v){  
                $pid = $v['pid'];   
                if($pid == 0){  
                    $tree[] = & $arr[$k];   
                }else{  
                    if(isset($refer[$pid])){  
                        $refer[$pid]['son'][] = & $arr[$k];  
                    }  
                }  
            }   
            return $tree;  
        }
}
使用方法:1、在数据库新建i_auth_group,i_auth_group_access,i_auth_rule三张表,具体数据自行添加
 -- 表的结构 `i_auth_group`
        CREATE TABLE IF NOT EXISTS `i_auth_group` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限组ID',
          `name` varchar(40) NOT NULL COMMENT '组名称',
          `auths` text COMMENT '组规则',
          `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '用户组状态',
          `remark` varchar(100) DEFAULT NULL COMMENT '组备注',
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='权限组' AUTO_INCREMENT=2 ;
        -- --------------------------------------------------------
        -- 表的结构 `i_auth_group_access`
        CREATE TABLE IF NOT EXISTS `i_auth_group_access` (
          `gid` int(10) unsigned NOT NULL COMMENT '权限组ID',
          `uid` int(10) unsigned NOT NULL COMMENT '用户id',
          PRIMARY KEY (`gid`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户组明细表';
        -- --------------------------------------------------------
        -- 表的结构 `i_auth_rule`
        CREATE TABLE IF NOT EXISTS `i_auth_rule` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '权限ID',
          `pid` int(10) NOT NULL,
          `title` varchar(40) NOT NULL COMMENT '权限名称',
          `ico` varchar(100) NOT NULL,
          `controller` varchar(100) NOT NULL COMMENT '控制器名称',
          `action` varchar(100) NOT NULL COMMENT '方法名称',
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='认证规则表' AUTO_INCREMENT=9 ;
        -- --------------------------------------------------------

2、在需要权限控制的公共控制器判断,如果uid=1(创始人)不作权限判断
//实例化权限类,并判断用户拥有的权限,具体显示页面自行修改
$authclass = new auth();
if(!$authclass->check($uid){//uid为登陆用户id
echo "没有权限喔!";
3、根据用户权限获取后台菜单,如果uid=1(创始人)会获取所有的菜单
$AuthClass = new auth();
$this->menu = $AuthClass->getAuths($uid);//uid为登陆用户id
4、后台模板页面代码,具体
/*示例,具体样式自行修改*/





2018-02-22 15:19:10

#2 jake

赞一个!

2018-02-23 08:59:50