微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给大家提供一下RBAC权限认证的源码

希望大家能沟互相学习,互相进步,请各位大神都不要吝啬能够提供更多的示例给大家参考。。。。

本源码是通过视频教程理解,然后自己写出来的(所以说是非原创),可能功能不是很完善,但是基本的权限控制效果可以实现,适合新手参考,高手的请飘过~~~~

希望大家能沟互相学习,互相进步,能够提滚更多的示例给大家参考。。。。

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

控制器地址:xuyuanHomeLibActionadmin

这个就是RBAC控制器代码

<?php

 class RBACAction extends PublicAction{

    //用户列表

    public function index(){

        $res=D('UserRelation')->field('password',true)->relation(true)->select();

        $this->assign('list',$res);

        $this->display();

    }

    //用户锁定处理

    public function indexlocked(){

        $id=$_GET['id'];

            //锁定用户

            if($id==1){//判断用户是否为超级管理员,如果是不能做任何操作(我的超级管理员ID为1)

                $this->error('对不起,您不能对此用户做任何操作!');

            }else{

                $i=M('User')->where(array('id'=>$id))->setField('lock','1');

                $this->success('用户已关闭!');

            }

    }

    //用户解锁处理

    public function indexlock(){

        $id=$_GET['id'];

        //解锁用户

            if($id==1){//判断用户是否为超级管理员,如果是不能做任何操作(我的超级管理员ID为1)

                $this->error('对不起,您不能对此用户做任何操作!');

            }else{

                $i=M('User')->where(array('id'=>$id))->setField('lock','0');

                $this->success('用户已开启!');

            }

    }

    //角色列表

    public function relo(){

        $relo = M('role')->select();

        $this->assign('relo',$relo);

        $this->display();

    }

    //节点列表

    public function node(){

        $field=array('id','name','title','pid');

        $node = M('node')->field($field)->order('sort')->select();

        $node=node_merge($node);

        //print_r($node);die;

        $this->assign('node',$node);

        $this->display();

    }

    //添加用户

    public function addUser(){

        $role=M('role')->select();

        $this->assign('role',$role);

        $this->display();

    }

    //添加用户表单接受

    public function addUserHandle(){

        //print_r($_POST);

        //判断注册用户是否存在

        $w=htmlspecialchars(trim($_POST['username']));

        $i=M('user')->where(array('username'=>$w))->select();

        if($i!=''){

            $this->error('用户名已存在!');

        }else{

        //组合用户信息并添加

            $user=array(

            'username'=>htmlspecialchars(trim($_POST['username'])),

            'password'=>md5($_POST['password']),

            'logintime'=>time(),

            'loginip'=>get_client_ip(),

            'lock'=>$_POST['lock']

            );

            //添加用户与角色关系

            $role=array();

            if($uid=M('user')->add($user)){

                foreach($_POST['role_id'] as $v){

                    $role[]=array(

                        'role_id'=>$v,

                        'user_id'=>$uid

                    );

                }

                M('role_user')->addAll($role);

                    $this->success('添加成功!',U('index'));

            }else{

                $this->error('添加失败!');

            }

        }

    }

    //添加角色

    public function addRole(){

        $this->display();

    }

    //添加角色接受表单

    public function addRoleHandle(){

        if(M('Role')->add($_POST)){

            $this->success('-_- yes!',U('relo'));

        }else{

            $this->error('-_-。sorry!');

        }

    }

    //添加节点

    public function addNode(){

        $pid=isset($_GET['pid'])?$_GET['pid']:0;

        $level=isset($_GET['level'])?$_GET['level']:1;

        $this->assign('pid',$pid);

        $this->assign('level',$level);

        switch($level){

            case 1:

                $this->type='应用';

                break;

            case 2:

                $this->type='控制器';

                break;

            case 3:

                $this->type='动作方法';

                break;

        }

        $this->display();

    }

    //添加节点接受表单

    public function addNodeHandle(){

        //print_r($_POST);

        if(M('Node')->add($_POST)){

            $this->success('-_- yes!',U('node'));

        }else{

            $this->error('-_-。sorry!');

        }

    

    }

    //配置权限

    public function access(){

        $rid=$_GET['rid'];

        //读取有用字段

        $field=array('id','pid');

        $node=M('node')->order('sort')->field($field)->select();

        

        //读取用户原有权限

        $access=M('access')->where(array('role_id'=>$rid))->getField('node_id',true);

        $node=node_merge($node,$access);

        

    

        $this->assign('rid',$rid);

        $this->assign('node',$node);

        $this->display();

    

    }

    //配置权限接受表单

    public function setAccess(){

        $rid=$_POST['rid'];

        $db=M('access');

        //删除原权限

        $db->where(array('role_id' => $rid))->delete();

        //组合新权限

        $data=array();

        foreach($_POST['access'] as $v){

            $tmp=explode('_',$v);

            $data[]=array(

                'role_id'=>$rid,

                'node_id'=>$tmp[0],

                'level'=>$tmp[1]

            );

        }

        //插入新权限

        if($db->addAll($data)){

            $this->success('修改成功!',U('relo'));

        }else{

            $this->error('修改失败!');

        }

        

    }

 }//end

 ?>

这是判断后台每个页面权限的小编。。。(这个PublicAction判断用户是否登录,我每个控制器都是继承他所以每个页面都有判断是否登录的判断,也就不存在可以直接跳过登录直接进来)

<?php

 class PublicAction extends Action{

    //判断用户是否登录

    public function _initialize(){

        if(!isset($_SESSION[C('USER_AUTH_KEY')])){

            $this->redirect('admin/Login/index');

        }

        $notAuth=in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))||in_array(ACTION_NAME,C('NOT_AUTH_ACTION')));

        if(C('USER_AUTH_ON')&& !$notAuth){

            import('ORG.Util.RBAC');

            RBAC::AccessDecision(GROUP_NAME)||$this->error('sorry!您无权访问!');

        

        }

    }

    

 }//end

 ?>

这个是登录模块判断

<?php

 //后台登录控制

 class LoginAction extends Action{

    //后台登录模板输出

    public function index(){

        $this->display();

    }

    //登录方法

    public function login (){

        if(!IS_POST) _404('坑爹呀,页面不存在!');

        $yzm=$_POST['yzm'];

        $username=$_POST['username'];

        $pwd=md5($_POST['password']);

        if($_SESSION['verify']!=md5($yzm)){

            $this->error('验证码错误!');

        }

        $i=M('User')->where(array('username'=>$username))->find();

        if(!$i|$i['password']!=$pwd){

            $this->error('用户名或者密码错误!');

        }

        if($i['lock']==1){

            $this->error('-_-。sorry!您的ID不合法!');

        }

        $data=array(

            'logintime'=>time(),

            'id'=>$i['id'],

        );

        M('User')->save($data);

            session(C('USER_AUTH_KEY'),$i['id']);

            session('username',$i['username']);

            session('logintime',date('Y-M-D H:i:s',$i['logintime']));

            session('loginip',$i['loginip']);

            

            

            

            //验证超级管理员

            if($i['username']==C('RBAC_SUPERADMIN')){

                session(C('ADMIN_AUTH_KEY'),true);

            }

            //引入RBAC并读取验证权限

            import('ORG.Util.RBAC');

            RBAC::saveAccessList();

            

            $this->redirect('admin/Index/index');

    }

    //引入验证码

    public function yzm(){

        import('ORG.Util.Image');

        Image::buildImageVerify(4,1,'png',80,32);

    }

    

 }//end

 ?>

这一块是后台配置文件

<?php

 return array(

    'TMPL_PARSE_STRING'=>array(

        '__PUBLIC__'=>__ROOT__.'/'.APP_NAME.'./Tpl/Admin/Public',

    ),

    'URL_HTML_SUFFIX'        =>    '.html',

    /**********************************RBAC配置*******************************************/

    'RBAC_SUPERADMIN'        =>    'admin',           //超级管理员名

    'ADMIN_AUTH_KEY'        =>    'superadmin',       //超级管理员识别

    'USER_AUTH_ON'            =>    true,               //是否开启验证

    'USER_AUTH_TYPE'        =>    1,                   //验证类型(1.登录验证2.实时验证)

    'USER_AUTH_KEY'            =>    'uid',               //用户认证识别号

    'NOT_AUTH_MODULE'        =>    'Index',                   //无需认证的控制器

    'NOT_AUTH_ACTION'        =>    'addUserHandle,addRoleHandle,addNodeHandle,setAccess',                   //无需验证的模块(动作方法)

    'RBAC_ROLE_TABLE'        =>    'hd_role',           //角色表名称

    'RBAC_USER_TABLE'        =>    'hd_role_user',       //角色与用户关联表名称

    'RBAC_NODE_TABLE'        =>    'hd_node',           //节点表名称

    'RBAC_ACCESS_TABLE'        =>    'hd_access'            //权限表名称

 );

 ?>

最后希望大家多多进步,多多分享。。。。(有分享才有进步嘛~~~)

完整代码下载:

点击下载

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐