RBAC 权限控制

Posted on Posted in php
Tips: 本文创建于2014年5月17日,已超过 2 年,内容或图片可能已经失效!

RBAC

权限控制

不同登录显示不同权限,防止用户越权访问

封装一个父类控制器
Components/AdminController.class.php

  1. <?php  
  2.   
  3. namespace Components;  
  4.   
  5. use Think\Controller;  
  6.   
  7. class AdminController extends Controller {  
  8. // 校验  
  9. public function __construct() {  
  10. // 一个类继承另一个类,如果本类有构造方法,一定要先执行父类构造方法,避免覆盖  
  11. parent::__construct (); // 调用父类的构造方法  
  12. $obj = D ();  
  13. // 过滤每个控制器和方法  
  14. // 获取当前用户有权利访问的具体权限列表  
  15. $sql = "select r.role_auth_ac from sw_manager m join sw_role r on m.mg_role_id=r.role_id where m.mg_id=".session('mgid');  
  16. $info = $obj->query ( $sql );  
  17. $ac = $info [0] ['role_auth_ac'];  
  18. // 用户当前访问的控制器和方法和数据库进行比较  
  19. $nowac = CONTROLLER_NAME . '-' . ACTION_NAME;  
  20.   
  21. // 开启允许访问的权限  
  22. $allowac = "Manager-login,Manager-verifyImg,Index-left,Index-head,Index-right,Index-index,Manager-logout";  
  23. if ((strpos ( $ac$nowac ) === false) && (strpos ( $allowac$nowac ) === false)) {  
  24. exit ( "没有权利访问" );  
  25. }  
  26. }  
  27. }  

C模块

IndexController.class.php

  1. public function left() {  
  2. // 根据不同用户获取不同的权限  
  3. // 根据session的id信心,获得对应的角色信息  
  4. // 联表查询  
  5. $role = D ( "Role" );  
  6. $manager = D ( "Manager" );  
  7. $auth = D ( "Auth" );  
  8. // 获得权限的IDS信息  
  9. $sql = "select r.role_auth_ids from sw_manager m join sw_role r on m.mg_role_id=r.role_id where m.mg_id=" . session ( 'mgid' );  
  10. $info = $manager->query ( $sql );  
  11. $authids = $info [0] ['role_auth_ids'];  
  12. $authinfoA = $auth->where ( "auth_id in ($authids) and auth_level=0" )->select (); // 顶级权限信息  
  13. $authinfoB = $auth->where ( "auth_id in ($authids) and auth_level=1" )->select (); // 次顶级权限信息  
  14.   
  15. $this->assign ( 'authinfoA', $authinfoA );  
  16. $this->assign ( 'authinfoB', $authinfoB );  
  17.   
  18. $this->display ();  
  19. }  

V模块

  1. {foreach $authinfoA as $k => $v}  
  2. <table cellspacing=0 cellpadding=0 width=150 border=0>  
  3. <tr height=22>  
  4. <td style="padding-left: 30px" background={$smarty.const.ADMIN_IMG_URL}menu_bt.jpg><a   
  5. class=menuparent onclick=expand({$v.auth_id})   
  6. href="javascript:void(0);">{$v.auth_name}</a></td></tr>  
  7. <tr height=4><td></td></tr>  
  8. </table>  
  9. <table id=child{$v.auth_id} style="display: none" cellspacing=0 cellpadding=0   
  10. width=150 border=0>  
  11. {foreach $authinfoB as $kk => $vv}  
  12. {if $vv.auth_pid==$v.auth_id}  
  13. <tr height=20>  
  14. <td align=middle width=30><img height=9   
  15. src="{$smarty.const.ADMIN_IMG_URL}menu_icon.gif" width=9></td>  
  16. <td><a class=menuchild href="{$smarty.const.__MODULE__}/{$vv.auth_c}/{$vv.auth_a}"   
  17. target='right'>{$vv.auth_name}</a></td>  
  18. </tr>  
  19. {/if}  
  20. {/foreach}  
  21. </table>  
  22. {/foreach}  

****************************************************************************

对角色进行权限分配

C模块

  1. <?php  
  2. namespace Admin\Controller;  
  3. use Components\AdminController;  
  4.   
  5. class RoleController extends AdminController{  
  6. function showlist(){  
  7. $info = D('Role')->select();  
  8. $this->assign('info',$info);  
  9. $this->display();  
  10. }  
  11. // 分配权限  
  12. function distribute($role_id){  
  13. // 显示与收集  
  14. if(!emptyempty($_POST)){  
  15. // RoleModel定义一个方法实现分配权限的处理  
  16. $role = new \Model\RoleModel();  
  17. $flag = $role->saveAuth($_POST['role_id'],$_POST['authinfo']);  
  18. if($flag){  
  19. $this->success('分配成功',U('showlist'));  
  20. }  
  21. }else{  
  22. // 获取权限信息  
  23. $authinfoA = D('Auth')->where('auth_level=0')->select();  
  24. $authinfoB = D('Auth')->where('auth_level=1')->select();  
  25.   
  26. // 获得角色信息  
  27. $roleinfo = D('Role')->find($role_id);  
  28. // 把ids字符串变数组  
  29. $authids_arr = explode(',',$roleinfo['role_auth_ids']);  
  30. //显示权限表单信息  
  31. $this->assign('authids_arr',$authids_arr);  
  32. $this->assign('authinfoA',$authinfoA);  
  33. $this->assign('authinfoB',$authinfoB);  
  34. $this->assign('roleinfo',$roleinfo);  
  35.   
  36. $this->display();  
  37. }  
  38. }  
  39. }  

M模块

  1. <?php  
  2. namespace Model;  
  3. use Think\Model;  
  4.   
  5. class RoleModel extends Model{  
  6. // 保存分配权限信息  
  7. function saveAuth($role_id,$authinfo){  
  8. // 把权限id信息通过逗号拼成字符串  
  9. $authids = implode(',',$authinfo);  
  10. // 根据ID信息,把权限查询的控制器和方法提取出来->字符串  
  11. $info = D('Auth')->where("auth_id in($authids)")->select();  
  12. $s = '';  
  13. foreach($info as $k => $v){  
  14. if((!emptyempty($v['auth_c'])) && !emptyempty($v['auth_a']))  
  15. $s .= $v['auth_c'].'-'.$v['auth_a'].',';  
  16. }  
  17. $s = rtrim($s,',');  
  18. // 更新记录信息  
  19. $data = array(  
  20. 'role_id' => $role_id,  
  21. 'role_auth_ids' => $authids,  
  22. 'role_auth_ac' => $s,  
  23. );  
  24. return $this->save($data);  
  25. }  
  26. }  

V模块

  1. {foreach $info as $k => $v}  
  2. <tr id="product{$v.role_id}">  
  3.   
  4. <td>{$v.role_id}</td>  
  5. <td>{$v.role_name}</td>  
  6. <td><a href="{$smarty.const.__CONTROLLER__}/distribute/role_id/{$v.role_id}">分配权限</a></td>  
  7. </tr>  
  8. {/foreach}  
  1. {foreach $authinfoA as $k => $v}  
  2. <li><input type='checkbox' name='authinfo[]' value='{$v.auth_id}' {if in_array($v.auth_id,$authids_arr)}checked='checked'{/if} />{$v.auth_name}</li>  
  3. <li>  
  4. <ul>  
  5. {foreach $authinfoB as $kk => $vv}  
  6. {if $vv.auth_pid==$v.auth_id}  
  7. <li><input type='checkbox' name='authinfo[]' value='{$vv.auth_id}' {if in_array($vv.auth_id,$authids_arr)}checked='checked'{/if}/>{$vv.auth_name}</li>  
  8. {/if}  
  9. {/foreach}  
  10. </ul>  
  11. </li>  
  12. {/foreach}  
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  2. <html>  
  3. <head>  
  4. <title>分配权限</title>  
  5. <meta http-equiv="content-type" content="text/html;charset=utf-8">  
  6. <link href="{$smarty.const.ADMIN_CSS_URL}mine.css" type="text/css" rel="stylesheet">  
  7. {literal}  
  8. <style type='text/css'>  
  9. li{list-style:none;}  
  10. </style>  
  11. {/literal}  
  12. </head>  
  13.   
  14. <body>  
  15.   
  16. <div class="div_head">  
  17. <span>  
  18. <span style="float:left">当前位置是:分配权限管理-》分配权限信息</span>  
  19. <span style="float:right;margin-right: 8px;font-weight: bold">  
  20. <a style="text-decoration: none" href="{$smarty.const.__CONTROLLER__}/showlist">【返回】</a>  
  21. </span>  
  22. </span>  
  23. </div>  
  24. <div></div>  
  25. <div>权限管理-分配权限<span style='font-size:20px;color:red;'>&lt;&lt;{$roleinfo.role_name}&gt;&gt;</span></div>  
  26. <form action='{$smarty.const.__SELF__}' method='post'>  
  27. <input type='hidden' name='role_id' value='{$roleinfo.role_id}' />  
  28. <!--展示全部权限信息供角色选择-->  
  29. <ul>  
  30. {foreach $authinfoA as $k => $v}  
  31. <li><input type='checkbox' name='authinfo[]' value='{$v.auth_id}' {if in_array($v.auth_id,$authids_arr)}checked='checked'{/if} />{$v.auth_name}</li>  
  32. <
    li>  
  33. <ul>  
  34. {foreach $authinfoB as $kk => $vv}  
  35. {if $vv.auth_pid==$v.auth_id}  
  36. <li><input type='checkbox' name='authinfo[]' value='{$vv.auth_id}' {if in_array($vv.auth_id,$authids_arr)}checked='checked'{/if}/>{$vv.auth_name}</li>  
  37. {/if}  
  38. {/foreach}  
  39. </ul>  
  40. </li>  
  41. {/foreach}  
  42. </ul>  
  43. <input type='submit' value='分配权限'>  
  44. </form>  
  45. </body>  
  46. </html>  

****************************************************************************

对权限信息进行维护

M模块

  1. <?php  
  2.   
  3. /** 
  4. * 后台权限Authmodel模型 
  5. */  
  6. namespace Model;  
  7. use Think\Model;  
  8.   
  9. class AuthModel extends Model{  
  10. //实现收集表单信息,整理,保存  
  11. function saveInfo($authinfo){  
  12. //把"全路径"和"level"等级根据已有信息给拼装起来  
  13. $new_id = $this -> add($authinfo);  
  14. //① 处理拼装"全路径"  
  15. //如果是顶级权限,则全路径与本身id相等  
  16. //如果不是顶级权限,全路径====父级全路径-本身id  
  17. if($authinfo['auth_pid']==0){  
  18. $path = $new_id;  
  19. else {  
  20. //获得父级全路径  
  21. $pinfo = $this -> find($authinfo['auth_pid']);  
  22. $fupath = $pinfo['auth_path'];  
  23. $path = $fupath."-".$new_id;  
  24. }  
  25. //② 处理等级level  
  26. //计算全路径里边"-"中恒线的数目即可  
  27. $auth_level = count(explode('-',$path))-1;  
  28.   
  29. $sql = "update sw_auth set auth_path='$path',auth_level='$auth_level' where auth_id=".$new_id;  
  30. return $this ->execute($sql);  
  31. }  
  32. }  

C模块

  1. <?php  
  2.   
  3. /* 
  4. * 后台权限控制器 
  5. */  
  6. namespace Admin\Controller;  
  7. use Components\AdminController;  
  8.   
  9. class AuthController extends AdminController{  
  10. function showlist(){  
  11. //获得全部权限信息  
  12. $info = D("Auth")->order('auth_path')->select();  
  13.   
  14. //在名称前边显示等级的单位符号  
  15. foreach($info as $k => $v){  
  16. $info[$k]['auth_name'] = str_repeat("--/",$v['auth_level']).$info[$k]['auth_name'];  
  17. }  
  18.   
  19. $this -> assign('info', $info);  
  20. $this -> display();  
  21. }  
  22.   
  23. //添加权限信息  
  24. function tianjia(){  
  25. //两个逻辑:展示表单、收集表单  
  26. if(!emptyempty($_POST)){  
  27. //在AuthModel模型里边自定义方法实现数据整理、添加  
  28. $auth = new \Model\AuthModel();  
  29. $z = $auth -> saveInfo($_POST);  
  30. if($z){  
  31. $this -> success('添加权限成功',U('showlist'));  
  32. }  
  33. else {  
  34. //获得上级信息  
  35. $pinfo = D("Auth")->where('auth_level=0')->select();  
  36. //把$pinfo信息赛选出id和名称  
  37. /*array( 
  38. 1=>'商品管理', 
  39. 2=>'订单管理', 
  40. 3=>'权限管理', 
  41. ) 
  42. */  
  43. $upinfo = array('0'=>'请选择');  
  44. foreach($pinfo as $k => $v){  
  45. $upinfo[$v['auth_id']] = $v['auth_name'];  
  46. }  
  47.   
  48. $this -> assign('upinfo', $upinfo);  
  49. $this -> display();  
  50. }  
  51. }  
  52. }  

V模块

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />  
  5.   
  6. <title>权限列表</title>  
  7.   
  8. <link href="{$smarty.const.ADMIN_CSS_URL}mine.css" type="text/css" rel="stylesheet" />  
  9. </head>  
  10. <body>  
  11. {literal}  
  12. <style>  
  13. .tr_color{background-color: #9F88FF}  
  14. </style>  
  15. {/literal}  
  16. <div class="div_head">  
  17. <span>  
  18. <span style="float: left;">当前位置是:权限管理-》权限列表</span>  
  19. <span style="float: right; margin-right: 8px; font-weight: bold;">  
  20. <a style="text-decoration: none;" href="{$smarty.const.__CONTROLLER__}/tianjia">【添加权限】</a>  
  21. </span>  
  22. </span>  
  23. </div>  
  24. <div></div>  
  25. <div style="font-size: 13px; margin: 10px 5px;">  
  26. <table class="table_a" border="1" width="100%">  
  27. <tbody><tr style="font-weight: bold;">  
  28. <td>序号</td>  
  29. <td>权限名称</td>  
  30. <td>控制器</td>  
  31. <td>操作方法</td>  
  32. <td>全路径</td>  
  33. <td>等级</td>  
  34. <td align="center">操作</td>  
  35. </tr>  
  36. {foreach $info as $k => $v}  
  37. <tr id="product1">  
  38. <td>{$v.auth_id}</td>  
  39. <td>{$v.auth_name}</td>  
  40. <td>{$v.auth_c}</td>  
  41. <td>{$v.auth_a}</td>  
  42. <td>{$v.auth_path}</td>  
  43. <td>{$v.auth_level}</td>  
  44. <td><a href="{$smarty.const.__CONTROLLER__}/distribute/role_id/{$v.role_id}">修改</a></td>  
  45. </tr>  
  46. {/foreach}  
  47. <tr>  
  48. <td colspan="20" style="text-align: center;">  
  49. {$pagelist}  
  50. </td>  
  51. </tr>  
  52. </tbody>  
  53. </table>  
  54. </div>  
  55. </body>  
  56. </html>  
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  2. <html>  
  3. <head>  
  4. <title>添加权限</title>  
  5. <meta http-equiv="content-type" content="text/html;charset=utf-8">  
  6. <link href="{$smarty.const.ADMIN_CSS_URL}mine.css" type="text/css" rel="stylesheet">  
  7. </head>  
  8.   
  9. <body>  
  10.   
  11. <div class="div_head">  
  12. <span
» 转载请注明来源:若我若鱼 » RBAC 权限控制

Leave a Reply

Your email address will not be published. Required fields are marked *

8 − four =