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

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

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

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

这个就是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','name','title','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, explode(',', 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(),
            'loginip'=>get_client_ip(),
            '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'            //权限表名称
 );
 ?>

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

完整代码下载:点击下载

我要评论

昵称:
验证码:

最新评论

共0条 共0页 10条/页 首页 上一页 下一页 尾页
意见反馈