首頁  >  文章  >  php教程  >  给大家提供一下RBAC权限认证的源码(非原创)

给大家提供一下RBAC权限认证的源码(非原创)

WBOY
WBOY原創
2016-06-07 11:43:511366瀏覽

希望大家能沟互相学习,互相进步,请各位大神都不要吝啬能够提供更多的示例给大家参考。。。。
本源码是通过视频教程理解,然后自己写出来的(所以说是非原创),可能功能不是很完善,但是基本的权限控制效果可以实现,适合新手参考,高手的请飘过~~~~
希望大家能沟互相学习,互相进步,能够提滚更多的示例给大家参考。。。。

好了废话不多说了,直接上东西。。。
(不好意思,本人也是初学,不会讲解,还得靠大家自己参照代码理解)

控制器地址:xuyuan\Home\Lib\Action\admin

这个就是RBAC控制器代码<?php <br /> class RBACAction extends PublicAction{<br>     //用户列表<br>     public function index(){<br>         $res=D('UserRelation')->field('password',true)->relation(true)->select();<br>         $this->assign('list',$res);<br>         $this->display();<br>     }<br>     //用户锁定处理<br>     public function indexlocked(){<br>         $id=$_GET['id'];<br>             //锁定用户<br>             if($id==1){//判断用户是否为超级管理员,如果是不能做任何操作(我的超级管理员ID为1)<br>                 $this->error('对不起,您不能对此用户做任何操作!');<br>             }else{<br>                 $i=M('User')->where(array('id'=>$id))->setField('lock','1');<br>                 $this->success('用户已关闭!');<br>             }<br>     }<br>     //用户解锁处理<br>     public function indexlock(){<br>         $id=$_GET['id'];<br>         //解锁用户<br>             if($id==1){//判断用户是否为超级管理员,如果是不能做任何操作(我的超级管理员ID为1)<br>                 $this->error('对不起,您不能对此用户做任何操作!');<br>             }else{<br>                 $i=M('User')->where(array('id'=>$id))->setField('lock','0');<br>                 $this->success('用户已开启!');<br>             }<br>     }<br>     //角色列表<br>     public function relo(){<br>         $relo = M('role')->select();<br>         $this->assign('relo',$relo);<br>         $this->display();<br>     }<br>     //节点列表<br>     public function node(){<br>         $field=array('id','name','title','pid');<br>         $node = M('node')->field($field)->order('sort')->select();<br>         $node=node_merge($node);<br>         //print_r($node);die;<br>         $this->assign('node',$node);<br>         $this->display();<br>     }<br>     //添加用户<br>     public function addUser(){<br>         $role=M('role')->select();<br>         $this->assign('role',$role);<br>         $this->display();<br>     }<br>     //添加用户表单接受<br>     public function addUserHandle(){<br>         //print_r($_POST);<br>         //判断注册用户是否存在<br>         $w=htmlspecialchars(trim($_POST['username']));<br>         $i=M('user')->where(array('username'=>$w))->select();<br>         if($i!=''){<br>             $this->error('用户名已存在!');<br>         }else{<br>         //组合用户信息并添加<br>             $user=array(<br>             'username'=>htmlspecialchars(trim($_POST['username'])),<br>             'password'=>md5($_POST['password']),<br>             'logintime'=>time(),<br>             'loginip'=>get_client_ip(),<br>             'lock'=>$_POST['lock']<br>             );<br>             //添加用户与角色关系<br>             $role=array();<br>             if($uid=M('user')->add($user)){<br>                 foreach($_POST['role_id'] as $v){<br>                     $role[]=array(<br>                         'role_id'=>$v,<br>                         'user_id'=>$uid<br>                     );<br>                 }<br>                 M('role_user')->addAll($role);<br>                     $this->success('添加成功!',U('index'));<br>             }else{<br>                 $this->error('添加失败!');<br>             }<br>         }<br>     }<br>     //添加角色<br>     public function addRole(){<br>         $this->display();<br>     }<br>     //添加角色接受表单<br>     public function addRoleHandle(){<br>         if(M('Role')->add($_POST)){<br>             $this->success('-_- yes!',U('relo'));<br>         }else{<br>             $this->error('-_-。sorry!');<br>         }<br>     }<br>     //添加节点<br>     public function addNode(){<br>         $pid=isset($_GET['pid'])?$_GET['pid']:0;<br>         $level=isset($_GET['level'])?$_GET['level']:1;<br>         $this->assign('pid',$pid);<br>         $this->assign('level',$level);<br>         switch($level){<br>             case 1:<br>                 $this->type='应用';<br>                 break;<br>             case 2:<br>                 $this->type='控制器';<br>                 break;<br>             case 3:<br>                 $this->type='动作方法';<br>                 break;<br>         }<br>         $this->display();<br>     }<br>     //添加节点接受表单<br>     public function addNodeHandle(){<br>         //print_r($_POST);<br>         if(M('Node')->add($_POST)){<br>             $this->success('-_- yes!',U('node'));<br>         }else{<br>             $this->error('-_-。sorry!');<br>         }<br>     <br>     }<br>     //配置权限<br>     public function access(){<br>         $rid=$_GET['rid'];<br>         //读取有用字段<br>         $field=array('id','name','title','pid');<br>         $node=M('node')->order('sort')->field($field)->select();<br>         <br>         //读取用户原有权限<br>         $access=M('access')->where(array('role_id'=>$rid))->getField('node_id',true);<br>         $node=node_merge($node,$access);<br>         <br>     <br>         $this->assign('rid',$rid);<br>         $this->assign('node',$node);<br>         $this->display();<br>     <br>     }<br>     //配置权限接受表单<br>     public function setAccess(){<br>         $rid=$_POST['rid'];<br>         $db=M('access');<br>         //删除原权限<br>         $db->where(array('role_id' => $rid))->delete();<br>         //组合新权限<br>         $data=array();<br>         foreach($_POST['access'] as $v){<br>             $tmp=explode('_',$v);<br>             $data[]=array(<br>                 'role_id'=>$rid,<br>                 'node_id'=>$tmp[0],<br>                 'level'=>$tmp[1]<br>             );<br>         }<br>         //插入新权限<br>         if($db->addAll($data)){<br>             $this->success('修改成功!',U('relo'));<br>         }else{<br>             $this->error('修改失败!');<br>         }<br>         <br>     }<br> }//end<br> <br> ?>这是判断后台每个页面权限的东东。。。(这个PublicAction判断用户是否登录,我每个控制器都是继承他所以每个页面都有判断是否登录的判断,也就不存在可以直接跳过登录直接进来)<?php <br /> class PublicAction extends Action{<br>     //判断用户是否登录<br>     public function _initialize(){<br>         if(!isset($_SESSION[C('USER_AUTH_KEY')])){<br>             $this->redirect('admin/Login/index');<br>         }<br>         $notAuth=in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))||in_array(ACTION_NAME, explode(',', C('NOT_AUTH_ACTION')));<br>         if(C('USER_AUTH_ON')&& !$notAuth){<br>             import('ORG.Util.RBAC');<br>             RBAC::AccessDecision(GROUP_NAME)||$this->error('sorry!您无权访问!');<br>         <br>         }<br>     }<br>     <br> }//end<br> <br> <br> <br> <br> ?>这个是登录模块判断<?php <br /> //后台登录控制<br> class LoginAction extends Action{<br>     //后台登录模板输出<br>     public function index(){<br>         $this->display();<br>     }<br>     //登录方法<br>     public function login (){<br>         if(!IS_POST) _404('坑爹呀,页面不存在!');<br>         $yzm=$_POST['yzm'];<br>         $username=$_POST['username'];<br>         $pwd=md5($_POST['password']);<br>         if($_SESSION['verify']!=md5($yzm)){<br>             $this->error('验证码错误!');<br>         }<br>         $i=M('User')->where(array('username'=>$username))->find();<br>         if(!$i|$i['password']!=$pwd){<br>             $this->error('用户名或者密码错误!');<br>         }<br>         if($i['lock']==1){<br>             $this->error('-_-。sorry!您的ID不合法!');<br>         }<br>         $data=array(<br>             'logintime'=>time(),<br>             'loginip'=>get_client_ip(),<br>             'id'=>$i['id'],<br>         );<br>         M('User')->save($data);<br>             session(C('USER_AUTH_KEY'),$i['id']);<br>             session('username',$i['username']);<br>             session('logintime',date('Y-M-D H:i:s',$i['logintime']));<br>             session('loginip',$i['loginip']);<br>             <br>             <br>             <br>             //验证超级管理员<br>             if($i['username']==C('RBAC_SUPERADMIN')){<br>                 session(C('ADMIN_AUTH_KEY'),true);<br>             }<br>             //引入RBAC并读取验证权限<br>             import('ORG.Util.RBAC');<br>             RBAC::saveAccessList();<br>             <br>             $this->redirect('admin/Index/index');<br>     }<br>     //引入验证码<br>     public function yzm(){<br>         import('ORG.Util.Image');<br>         Image::buildImageVerify(4,1,'png',80,32);<br>     }<br>     <br> }//end<br> <br> <br> <br> ?>这一块是后台配置文件<?php <br /> return array(<br>     'TMPL_PARSE_STRING'=>array(<br>         '__PUBLIC__'=>__ROOT__.'/'.APP_NAME.'./Tpl/Admin/Public',<br>     ),<br>     'URL_HTML_SUFFIX'        =>    '.html',<br>     /**********************************RBAC配置*******************************************/<br>     'RBAC_SUPERADMIN'        =>    'admin',            //超级管理员名<br>     'ADMIN_AUTH_KEY'        =>    'superadmin',        //超级管理员识别<br>     'USER_AUTH_ON'            =>    true,                //是否开启验证<br>     'USER_AUTH_TYPE'        =>    1,                    //验证类型(1.登录验证2.实时验证)<br>     'USER_AUTH_KEY'            =>    'uid',                //用户认证识别号<br>     'NOT_AUTH_MODULE'        =>    'Index',                    //无需认证的控制器<br>     'NOT_AUTH_ACTION'        =>    'addUserHandle,addRoleHandle,addNodeHandle,setAccess',                    //无需验证的模块(动作方法)<br>     'RBAC_ROLE_TABLE'        =>    'hd_role',            //角色表名称<br>     'RBAC_USER_TABLE'        =>    'hd_role_user',        //角色与用户关联表名称<br>     'RBAC_NODE_TABLE'        =>    'hd_node',            //节点表名称<br>     'RBAC_ACCESS_TABLE'        =>    'hd_access'            //权限表名称<br> );<br> <br> <br> ?>最后希望大家多多进步,多多分享。。。。(有分享才有进步嘛~~~)

(可不可以加个精啊!!! :)~~~~~)

附件 xuyuan.zip ( 1.77 MB 下载:458 次 )

AD:真正免费,域名+虚机+企业邮箱=0元

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn