给大家提供一下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'            //权限表名称

 );

 ?>

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

完整代码下载:

点击下载

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

相关推荐


(1)创建数据表: CREATE TABLE IF NOT EXISTS `think_form` (   `id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的
(1)创建模版:/App/Home/View/Form/edit.html   <FORM method=\"post\" action=\"__URL__/update\">
自定义配置文件user.php: <?php return array(    \'sex\'=>\'man\', ); config.php: <?php return array(
在一些成熟的CMS系统中,后台一般都包含一个配置中心(如织梦后台中系统设置),以方便站长在后台修改配置文件;那么这个功能是如果实现的呢?在ThinkPHP中有没有捷径可走呢?答案肯定是有的。下面大概说一下这个功能
废话不多说先上图预览下,即本博客的分页; 这个分页类是在thinkphp框架内置的分页类的基础上修改而来,原分页类的一些设计,在实际运用中感觉不是很方便;
在php中截取字符串的函数有很多,而在thinkphp中也可以直接使用php的函数,本文给大家简单的介绍thinkPHP模板中截取字符串的具体用法,希望能对各位有所帮助。
thinkphp开发图片上传,图片异步上传是目前比较方便的功能,这里我就不写css文件了,将代码写出来。
配置数据库:/app/Common/Conf/config.php 方法一: // 添加数据库配置信息 \'DB_TYPE\'   => \'mysql\',// 数据库类型
/app/Home/Controller/IndexController.class.php
(1)创建数据表: CREATE TABLE IF NOT EXISTS `think_data` (   `id` int(8) unsigned NOT NULL AUTO_INCREMENT,
(1)控制器设置:/app/Home/Controller/IndexController.class.php <?php namespace HomeController; use ThinkController;
(1)普通模式 http://localhost/index.php?m=module&a=action&var=value m参数表示模块,a操作表示操作(模块和操作的URL参数名称是可以配置的),后面的表示其他GET参数。
入库的时候用htmlspecialchars()处理含有html代码的内容 输出的时候用htmlspecialchars_decode()处理含有html代码的内容
<?php define(\'APP_NAME\',\'app\'); define(\'APP_PATH\',\'./app/\'); define(\'APP_DEBUG\',TRUE); // 开启调试模式
(1)创建控制器中定义read方法:/App/Home/Controller/FormController.class.php public function read($id=0){
一、实现不同字段相同的查询条件 $User = M(\"User\"); // 实例化User对象 $map[\'name|title\'] = \'thinkphp\';
如果你的数据完全是内部操作写入而不是通过表单的话(也就是说可以充分信任数据的安全),那么可以直接使用add方法,如:
查询表达式的使用格式: $map[\'字段名\'] = array(\'表达式\',\'查询条件\'); 表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:
一、使用字符串作为查询条件 $User = M(\"User\"); // 实例化User对象 $User->where(\'type=1 AND status=1\')->select();