RBAC权限认证的源码

RBAC控制器代码,跟大家分享一下


  1. <?php
  2. class RBACAction extends PublicAction{
  3.     //用户列表
  4.     public function index(){
  5.         $res=D('UserRelation')->field('password',true)->relation(true)->select();
  6.         $this->assign('list',$res);
  7.         $this->display();
  8.     }
  9.     //用户锁定处理
  10.     public function indexlocked(){
  11.         $id=$_GET['id'];
  12.             //锁定用户
  13.             if($id==1){//判断用户是否为超级管理员,如果是不能做任何操作(我的超级管理员ID为1)
  14.                 $this->error('对不起,您不能对此用户做任何操作!');
  15.             }else{
  16.                 $i=M('User')->where(array('id'=>$id))->setField('lock','1');
  17.                 $this->success('用户已关闭!');
  18.             }
  19.     }
  20.     //用户解锁处理
  21.     public function indexlock(){
  22.         $id=$_GET['id'];
  23.         //解锁用户
  24.             if($id==1){//判断用户是否为超级管理员,如果是不能做任何操作(我的超级管理员ID为1)
  25.                 $this->error('对不起,您不能对此用户做任何操作!');
  26.             }else{
  27.                 $i=M('User')->where(array('id'=>$id))->setField('lock','0');
  28.                 $this->success('用户已开启!');
  29.             }
  30.     }
  31.     //角色列表
  32.     public function relo(){
  33.         $relo = M('role')->select();
  34.         $this->assign('relo',$relo);
  35.         $this->display();
  36.     }
  37.     //节点列表
  38.     public function node(){
  39.         $field=array('id','name','title','pid');
  40.         $node = M('node')->field($field)->order('sort')->select();
  41.         $node=node_merge($node);
  42.         //print_r($node);die;
  43.         $this->assign('node',$node);
  44.         $this->display();
  45.     }
  46.     //添加用户
  47.     public function addUser(){
  48.         $role=M('role')->select();
  49.         $this->assign('role',$role);
  50.         $this->display();
  51.     }
  52.     //添加用户表单接受
  53.     public function addUserHandle(){
  54.         //print_r($_POST);
  55.         //判断注册用户是否存在
  56.         $w=htmlspecialchars(trim($_POST['username']));
  57.         $i=M('user')->where(array('username'=>$w))->select();
  58.         if($i!=''){
  59.             $this->error('用户名已存在!');
  60.         }else{
  61.         //组合用户信息并添加
  62.             $user=array(
  63.             'username'=>htmlspecialchars(trim($_POST['username'])),
  64.             'password'=>md5($_POST['password']),
  65.             'logintime'=>time(),
  66.             'loginip'=>get_client_ip(),
  67.             'lock'=>$_POST['lock']
  68.             );
  69.             //添加用户与角色关系
  70.             $role=array();
  71.             if($uid=M('user')->add($user)){
  72.                 foreach($_POST['role_id'] as $v){
  73.                     $role[]=array(
  74.                         'role_id'=>$v,
  75.                         'user_id'=>$uid
  76.                     );
  77.                 }
  78.                 M('role_user')->addAll($role);
  79.                     $this->success('添加成功!',U('index'));
  80.             }else{
  81.                 $this->error('添加失败!');
  82.             }
  83.         }
  84.     }
  85.     //添加角色
  86.     public function addRole(){
  87.         $this->display();
  88.     }
  89.     //添加角色接受表单
  90.     public function addRoleHandle(){
  91.         if(M('Role')->add($_POST)){
  92.             $this->success('-_- yes!',U('relo'));
  93.         }else{
  94.             $this->error('-_-。sorry!');
  95.         }
  96.     }
  97.     //添加节点
  98.     public function addNode(){
  99.         $pid=isset($_GET['pid'])?$_GET['pid']:0;
  100.         $level=isset($_GET['level'])?$_GET['level']:1;
  101.         $this->assign('pid',$pid);
  102.         $this->assign('level',$level);
  103.         switch($level){
  104.             case 1:
  105.                 $this->type='应用';
  106.                 break;
  107.             case 2:
  108.                 $this->type='控制器';
  109.                 break;
  110.             case 3:
  111.                 $this->type='动作方法';
  112.                 break;
  113.         }
  114.         $this->display();
  115.     }
  116.     //添加节点接受表单
  117.     public function addNodeHandle(){
  118.         //print_r($_POST);
  119.         if(M('Node')->add($_POST)){
  120.             $this->success('-_- yes!',U('node'));
  121.         }else{
  122.             $this->error('-_-。sorry!');
  123.         }
  124.     
  125.     }
  126.     //配置权限
  127.     public function access(){
  128.         $rid=$_GET['rid'];
  129.         //读取有用字段
  130.         $field=array('id','name','title','pid');
  131.         $node=M('node')->order('sort')->field($field)->select();
  132.         
  133.         //读取用户原有权限
  134.         $access=M('access')->where(array('role_id'=>$rid))->getField('node_id',true);
  135.         $node=node_merge($node,$access);
  136.         
  137.     
  138.         $this->assign('rid',$rid);
  139.         $this->assign('node',$node);
  140.         $this->display();
  141.     
  142.     }
  143.     //配置权限接受表单
  144.     public function setAccess(){
  145.         $rid=$_POST['rid'];
  146.         $db=M('access');
  147.         //删除原权限
  148.         $db->where(array('role_id' => $rid))->delete();
  149.         //组合新权限
  150.         $data=array();
  151.         foreach($_POST['access'] as $v){
  152.             $tmp=explode('_',$v);
  153.             $data[]=array(
  154.                 'role_id'=>$rid,
  155.                 'node_id'=>$tmp[0],
  156.                 'level'=>$tmp[1]
  157.             );
  158.         }
  159.         //插入新权限
  160.         if($db->addAll($data)){
  161.             $this->success('修改成功!',U('relo'));
  162.         }else{
  163.             $this->error('修改失败!');
  164.         }
  165.         
  166.     }
  167. }//end
  168. ?>
复制代码
这是判断后台每个页面权限的,判断用户是否登录,我每个控制器都是继承他所以每个页面都有判断是否登录的判断,也就不存在可以直接跳过登录直接进来)
  1. <?php
  2. class PublicAction extends Action{
  3.     //判断用户是否登录
  4.     public function _initialize(){
  5.         if(!isset($_SESSION[C('USER_AUTH_KEY')])){
  6.             $this->redirect('admin/Login/index');
  7.         }
  8.         $notAuth=in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))||in_array(ACTION_NAME, explode(',', C('NOT_AUTH_ACTION')));
  9.         if(C('USER_AUTH_ON')&& !$notAuth){
  10.             import('ORG.Util.RBAC');
  11.             RBAC::AccessDecision(GROUP_NAME)||$this->error('sorry!您无权访问!');
  12.         
  13.         }
  14.     }
  15.     
  16. }//end
  17. ?>
复制代码
这个是登录模块判断
  1. <?php
  2. //后台登录控制
  3. class LoginAction extends Action{
  4.     //后台登录模板输出
  5.     public function index(){
  6.         $this->display();
  7.     }
  8.     //登录方法
  9.     public function login (){
  10.         if(!IS_POST) _404('404,页面不存在!');
  11.         $yzm=$_POST['yzm'];
  12.         $username=$_POST['username'];
  13.         $pwd=md5($_POST['password']);
  14.         if($_SESSION['verify']!=md5($yzm)){
  15.             $this->error('验证码错误!');
  16.         }
  17.         $i=M('User')->where(array('username'=>$username))->find();
  18.         if(!$i|$i['password']!=$pwd){
  19.             $this->error('用户名或者密码错误!');
  20.         }
  21.         if($i['lock']==1){
  22.             $this->error('-_-。抱歉!ID不合法!');
  23.         }
  24.         $data=array(
  25.             'logintime'=>time(),
  26.             'loginip'=>get_client_ip(),
  27.             'id'=>$i['id'],
  28.         );
  29.         M('User')->save($data);
  30.             session(C('USER_AUTH_KEY'),$i['id']);
  31.             session('username',$i['username']);
  32.             session('logintime',date('Y-M-D H:i:s',$i['logintime']));
  33.             session('loginip',$i['loginip']);
  34.             
  35.             
  36.             
  37.             //验证超级管理员
  38.             if($i['username']==C('RBAC_SUPERADMIN')){
  39.                 session(C('ADMIN_AUTH_KEY'),true);
  40.             }
  41.             //引入RBAC并读取验证权限
  42.             import('ORG.Util.RBAC');
  43.             RBAC::saveAccessList();
  44.             
  45.             $this->redirect('admin/Index/index');
  46.     }
  47.     //引入验证码
  48.     public function yzm(){
  49.         import('ORG.Util.Image');
  50.         Image::buildImageVerify(4,1,'png',80,32);
  51.     }
  52.     
  53. }//end
  54. ?>

这一块是后台配置文件
  1. <?php
  2. return array(
  3.     'TMPL_PARSE_STRING'=>array(
  4.         '__PUBLIC__'=>__ROOT__.'/'.APP_NAME.'./Tpl/Admin/Public',
  5.     ),
  6.     'URL_HTML_SUFFIX'        =>    '.html',
  7.     /**********************************RBAC配置*******************************************/
  8.     'RBAC_SUPERADMIN'        =>    'admin',            //超级管理员名
  9.     'ADMIN_AUTH_KEY'        =>    'superadmin',        //超级管理员识别
  10.     'USER_AUTH_ON'            =>    true,                //是否开启验证
  11.     'USER_AUTH_TYPE'        =>    1,                    //验证类型(1.登录验证2.实时验证)
  12.     'USER_AUTH_KEY'            =>    'uid',                //用户认证识别号
  13.     'NOT_AUTH_MODULE'        =>    'Index',                    //无需认证的控制器
  14.     'NOT_AUTH_ACTION'        =>    'addUserHandle,addRoleHandle,addNodeHandle,setAccess',                    //无需验证的模块(动作方法)
  15.     'RBAC_ROLE_TABLE'        =>    'hd_role',            //角色表名称
  16.     'RBAC_USER_TABLE'        =>    'hd_role_user',        //角色与用户关联表名称
  17.     'RBAC_NODE_TABLE'        =>    'hd_node',            //节点表名称
  18.     'RBAC_ACCESS_TABLE'        =>    'hd_access'            //权限表名称
  19. );
  20. ?>

最后希望对大家有帮助。!!!!













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值