rbac(php)
来源:互联网 发布:格式转换软件 编辑:程序博客网 时间:2024/06/06 05:35
首先,类似于rbac一样,我们需要在数据库建立3张表,这里会比rbac少一张表,我是觉得没有必要弄得那么复杂。那么第一张是用户表user,用来存管理员且分配用户组,第二张表就是组权限表access,用来存用户组及权限表,第三张是动作方法表method,用来存控制器和方法及一些控制器和方法的说明等,建好这三张表,数据库这边的准备工作就基本完成了。
第二步,写出自己需要的html页面来让用户输入这三张表需要填充的类容。写个控制器来接收存库就好了,由于这个地方太基础,我就不啰嗦了,实在不行可以给我留言。
第三部,编写权限管理类,我自己给命了个名字AUTHHW.class.php,那么里面的类容我就不详细说了,反正都是要上代码的,我由于不是大神,所以写的代码应该你们都是能看懂的,所以我就不逼逼了,这个类的算法如下:
AUTHHW.class.php
第四步,编写一个CommonController控制器,在里面写一个方法,实时验证权限,记得把权限类导入进来,也直接上代码吧:
好了,到这里我们就差最后一步了,到配置文件里面去配置超级管理员和不需要验证的动作方法吧,rbac的配置有很多,而且好像超级管理员只能设置一个,我这个配置的话就2个,不多,但是超级管理员的个数是可以根据你自己的需求任意设置的,但是需要你谨慎设置了,直接给你们上代码吧:
<?php
return array(
//'配置项'=>'配置值'
"SUPERADMIN"=>"yhw;tx",//配置超级管理员,多个账号用“;”隔开;注意,超级管理员为系统最高级别的管理者,不受程序管理,请谨慎配置
"NOTVERIFY"=>"Index/index;Index/dd;Index/logout"//配置不需要验证的方法:控制器/方法,多个方法用“;”隔开
);
好了,现在你把需要验证的控制器里面都继承Common这个控制器就可以用啦
类似这样:class IndexController extends CommonController
好了小伙伴们,快去试试吧。我第一次发这种教程帖子,有什么说的不对的地方请大家多多包涵,我不是特别专业的程序员,有些想法不正确的,希望在座的大神多多提点,程序有什么缺陷也请各位大神批评指导!
第二步,写出自己需要的html页面来让用户输入这三张表需要填充的类容。写个控制器来接收存库就好了,由于这个地方太基础,我就不啰嗦了,实在不行可以给我留言。
第三部,编写权限管理类,我自己给命了个名字AUTHHW.class.php,那么里面的类容我就不详细说了,反正都是要上代码的,我由于不是大神,所以写的代码应该你们都是能看懂的,所以我就不逼逼了,这个类的算法如下:
AUTHHW.class.php
- <?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | 纯属业余研究,希望大神指点
- // +----------------------------------------------------------------------
- // | Author: yxw admin@yxw21.com 杨小二 617190787@qq.com
- // +----------------------------------------------------------------------
- namespace Org\Util;
- use Think\Db;
- /**
- +------------------------------------------------------------------------------
- * 基于角色的数据库方式验证类
- +------------------------------------------------------------------------------
- */
- /*
- -- --------------------------------------------------------
- 权限表建表语句
- CREATE TABLE IF NOT EXISTS `access` (
- `id` int(1) NOT NULL AUTO_INCREMENT,
- `name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
- `tip` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
- `access` varchar(500) COLLATE utf8_unicode_ci DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
- -- --------------------------------------------------------
- //动作方法建表语句
- CREATE TABLE IF NOT EXISTS `mothed` (
- `id` int(1) NOT NULL AUTO_INCREMENT,
- `controller` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
- `c_tip` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
- `method` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
- `mtip` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10 ;
- -- --------------------------------------------------------
- 用户建表语句
- CREATE TABLE IF NOT EXISTS `user` (
- `id` int(1) NOT NULL AUTO_INCREMENT,
- `name` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
- `pwd` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
- `access_id` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
- `luck` int(1) NOT NULL DEFAULT '1',
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
- */
- class ClassName extends AnotherClass
- {
- function __construct(argument)
- {
- # code...
- }
- }
- class AUTHHW {
- static function check_access($c_msg){
- if (!in_array($_SESSION['uname'], explode(";", C("SUPERADMIN")))) {
- $NOTVERIFY=explode(";",C("NOTVERIFY"));
- $access_id=M('user')->where($map['id']=$_SESSION['uid'])->field('access_id')->find();
- $msg['id']=$access_id['access_id'];
- $access=M('access')->where($map)->field('access')->find();
- $htmlContent=<<<EOF
- <style>
- *{margin:0;padding:0;list-style-type:none}
- div{position: relative;left: 36%;top:35%;width:450px;height:150px;border:1px solid rgb(220,220,220);border-radius:5px;background:rgb(245,250,254);}
- div p{display:block;width:100%;height:35px;border-radius:5px 5px 0 0;font-family: Microsoft YaHei;font-size:18px;line-height:40px;text-indent:30px;font-weight:bold;color:rgb(99,150,70)}
- div i{display:block;width:100%;height:1px;border-bottom:1px dashed;opacity:0.2}
- ul{width:86%;height:60%;margin:10px auto;}
- h2{font-size:16px;margin-bottom:10px;margin-top:15px;color:rgb(69,116,127);font-family: Microsoft YaHei;}
- span{font-size:14px;color:rgb(69,116,127);font-family: Microsoft YaHei;}
- label{display:block;width:70px;font-size:12px;cursor: pointer;margin-top:20px;text-decoration: underline;font-family: Microsoft YaHei;color:grey}
- img{width:70px;height:70px;position: absolute;right:70px;top:50px;}
- </style>
- <body></body>
- <script>
- var div= document.createElement("div");
- div.innerHTML='<p>访问受限</p><i></i><ul><li><h2>您没有访问权限</h2></li><li><span>抱歉,该功能未对当前账号开放!</span></li><li><label onclick="back()">返回》》》</label></li></ul><img src="http://static.tieba.baidu.com/tb/editor/images/client/image_emoticon25.png">';
- document.body.appendChild(div);
- function back(){window.location.href="http://localhost/vedioweb/index.php/Admin/Index/index";}
- </script>
- EOF;
- if ($access['access']) {
- $arr=explode(';', $access['access']);
- $flog=false;
- foreach ($arr as $value) {
- $map['id']=$value;
- $res=M('mothed')->where($map)->find();
- if ($c_msg==$res['controller']."/".$res['method']||in_array($c_msg, $NOTVERIFY)){
- $flog=true;
- break;
- }
- }
- if ($flog) {
- return($flog);
- }else{
- die($htmlContent);
- }
- }else{
- die($htmlContent);
- }
- }else{
- return true;
- }
- }
- //重组数组
- function reconarr($res){
- $reconarr=array();
- foreach ($res as $key=>$value) {
- if(inarray($value["controller"], $reconarr,true)===null)$reconarr[]=array("controller"=>$value["controller"],"c_tip"=>$value["c_tip"]);
- $keys=inarray($value["controller"], $reconarr,true);
- if($keys!==null && inarray($value["method"], $reconarr,true)==null)$reconarr[$keys]["child"][]=array("method"=>$value["method"],"m_tip"=>$value["mtip"]);
- }
- return $reconarr;
- }
- function inarray($str,$arr,$flag=false,$keys){
- if(!$flag)return in_array($str, $arr);
- foreach ($arr as $key=>$value){
- if(is_array($value))$res=inarray($str,$value,true,$key);
- if($res!==null)break;
- if($value==$str)return $keys;
- }
- return $res;
- }
- }
- ?>
复制代码
逻辑简单,代码量也很少,到这儿我们离成功就很近了,写好了这个类,你把它封装好放到org/Util文件下就可以了。第四步,编写一个CommonController控制器,在里面写一个方法,实时验证权限,记得把权限类导入进来,也直接上代码吧:
- <?php
- namespace Admin\Controller;
- use Think\Controller;
- use Org\Util\AUTHHW;
- header("content-type:text/html;charset=utf-8");
- class CommonController extends Controller {
- public function _initialize(){
- import('ORG.Util.AUTHHW');
- if(!$_SESSION['uid']){
- $htmlContent=<<<EOF
- <style>
- *{margin:0;padding:0;list-style-type:none}
- div{position: relative;left: 36%;top:35%;width:450px;height:150px;border:1px solid rgb(220,220,220);border-radius:5px;background:rgb(245,250,254);}
- div p{display:block;width:100%;height:35px;border-radius:5px 5px 0 0;font-family: Microsoft YaHei;font-size:18px;line-height:40px;text-indent:30px;font-weight:bold;color:rgb(99,150,70)}
- div i{display:block;width:100%;height:1px;border-bottom:1px dashed;opacity:0.2}
- ul{width:86%;height:60%;margin:10px auto;}
- h2{font-size:16px;margin-bottom:10px;margin-top:15px;color:rgb(69,116,127);font-family: Microsoft YaHei;}
- span{font-size:14px;color:rgb(69,116,127);font-family: Microsoft YaHei;}
- label{display:block;width:140px;font-size:12px;cursor: pointer;margin-top:20px;text-decoration: underline;font-family: Microsoft YaHei;color:grey}
- img{width:70px;height:70px;position: absolute;right:70px;top:50px;}
- </style>
- <body></body>
- <script>
- var div= document.createElement("div");
- div.innerHTML='<p>访问受限</p><i></i><ul><li><h2>您当前未登陆</h2></li><li><span>抱歉,后台访问需登录后才能继续!</span></li><li><label onclick="back()">前往登陆》》》</label></li></ul><img src="http://static.tieba.baidu.com/tb/editor/images/client/image_emoticon25.png">';
- document.body.appendChild(div);
- function back(){window.location.href="http://localhost/vedioweb/index.php/Admin/Login/login";}
- </script>
- EOF;
- die($htmlContent);}
- AUTHHW::check_access(CONTROLLER_NAME."/".ACTION_NAME);
- }
- }
复制代码
EOF之间包着的是提示语句,可以根据自己的需求自己改,我不做前端,所以写的很粗糙,这个就让你们自由发挥了。好了,到这里我们就差最后一步了,到配置文件里面去配置超级管理员和不需要验证的动作方法吧,rbac的配置有很多,而且好像超级管理员只能设置一个,我这个配置的话就2个,不多,但是超级管理员的个数是可以根据你自己的需求任意设置的,但是需要你谨慎设置了,直接给你们上代码吧:
<?php
return array(
//'配置项'=>'配置值'
"SUPERADMIN"=>"yhw;tx",//配置超级管理员,多个账号用“;”隔开;注意,超级管理员为系统最高级别的管理者,不受程序管理,请谨慎配置
"NOTVERIFY"=>"Index/index;Index/dd;Index/logout"//配置不需要验证的方法:控制器/方法,多个方法用“;”隔开
);
好了,现在你把需要验证的控制器里面都继承Common这个控制器就可以用啦
类似这样:class IndexController extends CommonController
好了小伙伴们,快去试试吧。我第一次发这种教程帖子,有什么说的不对的地方请大家多多包涵,我不是特别专业的程序员,有些想法不正确的,希望在座的大神多多提点,程序有什么缺陷也请各位大神批评指导!
阅读全文
0 0
- RBAC php
- rbac(php)
- RBAC的php实现
- PHP后台RBAC图解
- 11 php RBAC
- [php] thinkphp RBAC解析
- php实现RBAC
- RBAC在PHP中的应用
- 四大php框架rbac功能分析
- php项目中的RBAC权限
- 快速搭建php rbac后台
- RBAC
- RBAC
- rbac
- RBAC
- RBAC
- RBAC
- RBAC
- Java面试题--static关键字
- Python+Flask搭建一个电影下载网站
- 每天一个linux命令(60):scp命令
- ORB-SLAM:一种通用的(全能的)精确的单目SLAM系统(ORB-SLAM:一种通用的(全能的)精确的单目SLAM系统)
- UPnP基本应用及原理
- rbac(php)
- mysql登录时出现“程序注册时间到期 程序将被限制模式下运行”
- jS中第一级函数
- hrbust2363 Symmys(manacher+dp)
- 程序设计入门4 子序列的和
- <url-pattern>写成/和/*的区别
- 71A. Way Too Long Words
- CZJ-Superman HNUST 1880
- Windows Server上安装部署Zabbix agent(最新版)