Home > php教程 > php手册 > body text

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

WBOY
Release: 2016-06-07 11:43:51
Original
1361 people have browsed it

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

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

控制器地址: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元

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template