首頁 後端開發 php教程 ThinkPHP学习札记(十九)权限管理的实现方式RBAC

ThinkPHP学习札记(十九)权限管理的实现方式RBAC

Jun 13, 2016 pm 12:54 PM
auth gt null quot user

ThinkPHP学习笔记(十九)权限管理的实现方式RBAC


Action的方法

<?php /**
 * 基于权限的角色访问控制
 * Full扩展保重的RBAC.class.php
 * 
 * 安全拦截器
 * 
 * 认证管理器(识别不同身份)
 * 
 * 决策访问管理器(即时模式:立即生效;登录模式:下次登录时生效)
 * 
 * 运行身份管理(单身份、多身份管理B/S)
 * 
 * 
 * 需要当前类和Public和Common类
 * PublicAction:做用户登录和退出
 * CommonAction:初始化接口,需要在这个里面写上一个初始化接口来实现对权限的认证和修改,每个方法都会经过他’
 * 		如果不需要验证的模块,则不需要继承CommonAction
 * 1.去RBAC.class.php中拷贝需要创建的数据库表
 * 		需要修改access表,加入`pid` int(11) NOT NULL,这个字段
		CREATE TABLE IF NOT EXISTS `think_access` (
		  `role_id` smallint(6) unsigned NOT NULL,
		  `node_id` smallint(6) unsigned NOT NULL,
		  `level` tinyint(1) NOT NULL,
		  `module` varchar(50) DEFAULT NULL,
		  `pid` int(11) NOT NULL,
		  KEY `groupId` (`role_id`),
		  KEY `nodeId` (`node_id`)
		) ENGINE=MyISAM DEFAULT CHARSET=utf8;
		
		CREATE TABLE IF NOT EXISTS `think_node` (
		  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
		  `name` varchar(20) NOT NULL,
		  `title` varchar(50) DEFAULT NULL,
		  `status` tinyint(1) DEFAULT '0',
		  `remark` varchar(255) DEFAULT NULL,
		  `sort` smallint(6) unsigned DEFAULT NULL,
		  `pid` smallint(6) unsigned NOT NULL,
		  `level` tinyint(1) unsigned NOT NULL,
		  PRIMARY KEY (`id`),
		  KEY `level` (`level`),
		  KEY `pid` (`pid`),
		  KEY `status` (`status`),
		  KEY `name` (`name`)
		) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
		
		CREATE TABLE IF NOT EXISTS `think_role` (
		  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
		  `name` varchar(20) NOT NULL,
		  `pid` smallint(6) DEFAULT NULL,
		  `status` tinyint(1) unsigned DEFAULT NULL,
		  `remark` varchar(255) DEFAULT NULL,
		  PRIMARY KEY (`id`),
		  KEY `pid` (`pid`),
		  KEY `status` (`status`)
		) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;
		
		CREATE TABLE IF NOT EXISTS `think_role_user` (
		  `role_id` mediumint(9) unsigned DEFAULT NULL,
		  `user_id` char(32) DEFAULT NULL,
		  KEY `group_id` (`role_id`),
		  KEY `user_id` (`user_id`)
		) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 * 
 * 2.创建用户表的必须字段:id、username、password
 * 		五张表的对应关系:
 * 			节点表:think_node
 * 			权限表: think_access(
 * 				项目模块和方法之间的关系;
 * 				用户访问项目(level为1)、模块(level为2)、方法(level为3)直接的关系用节点来表示)
 * 			权限组:think_role
 * 			用户表:tb_user
 * 			用户和组的对应关系:think_role_user
 * 		access控制组与模块方法的关系
 * 3.修改配置文件
 * 4.修改CommonAction
 * 5.当前方法需要继承CommonAction
 */
class RbacAction extends CommonAction{
    public function index(){
    }
    public function add(){
    }
    public function update(){
    }
    public function delete(){
    }
}
?>
登入後複製

下面上一下五张表的数据

tb_user:用户表

Role权限组表

role_user:权限组与用户的对应关系表

node表:表示当前项目中url分类,精确到每个方法的控制

access表:表示不同用户组对应的可以访问的不同url分类

config中需要设置的参数:

//设置rbac的参数
	'USER_AUTH_ON'=>true,
	'USER_AUTH_TYPE'			=>1,		// 默认认证类型 1 登录认证 2 即使认证
	'USER_AUTH_KEY'			=>'authId',	// 用户认证SESSION标记
    'ADMIN_AUTH_KEY'			=>'administrator',//管理员标识
	'USER_AUTH_MODEL'		=>'User',	// 默认验证数据表模型
	'AUTH_PWD_ENCODER'		=>'md5',	// 用户认证密码加密方式
	'USER_AUTH_GATEWAY'	=>'/Public/login',	// 默认认证网关
	'NOT_AUTH_MODULE'		=>'Public',		// 默认无需认证模块
	'REQUIRE_AUTH_MODULE'=>'',		// 默认需要认证模块
	'NOT_AUTH_ACTION'		=>'',		// 默认无需认证操作
	'REQUIRE_AUTH_ACTION'=>'',		// 默认需要认证操作
    'GUEST_AUTH_ON'          => false,    // 是否开启游客授权访问
    'GUEST_AUTH_ID'           =>    0,     // 游客的用户ID(可以在数据库组中设置一个id为0的游客组)
	'SHOW_RUN_TIME'=>true,			// 运行时间显示
	'SHOW_ADV_TIME'=>true,			// 显示详细的运行时间
	'SHOW_DB_TIMES'=>true,			// 显示数据库查询和写入次数
	'SHOW_CACHE_TIMES'=>true,		// 显示缓存操作次数
	'SHOW_USE_MEM'=>true,			// 显示内存开销
    'DB_LIKE_FIELDS'=>'title|remark',
	'RBAC_ROLE_TABLE'=>'think_role',
	'RBAC_USER_TABLE'	=>	'think_role_user',
	'RBAC_ACCESS_TABLE' =>	'think_access',
	'RBAC_NODE_TABLE'	=> 'think_node',
登入後複製

PublicAction中需要设置的公共访问方法;(命名基于配置中的NOT_AUTH_MODULE的配置)

<?php /**
 * 基于权限的角色访问控制
 * Full扩展保重的RBAC.class.php
 * 主要用于登录和退出
 *
 */
class PublicAction extends Action{
    public function index(){
    	$this->login();
    }
    public function login(){
    	$this->display();
    }
    //可以去例子中复制
    public function checkLogin(){
		if(empty($_POST['username'])) {
			$this->error('帐号错误!');
		}elseif (empty($_POST['password'])){
			$this->error('密码必须!');
//		}elseif (empty($_POST['verify'])){
//			$this->error('验证码必须!');
		}
        //生成认证条件
        $map            =   array();
		// 支持使用绑定帐号登录
		$map['username']	= $_POST['username'];
//        $map["status"]	=	array('gt',0);
//		if($_SESSION['verify'] != md5($_POST['verify'])) {
//			$this->error('验证码错误!');
//		}
		import ( 'ORG.Util.RBAC' );
        $authInfo = RBAC::authenticate($map);
        //使用用户名、密码和状态的方式进行认证
        if(false === $authInfo) {
            $this->error('帐号不存在或已禁用!');
        }else {
            if($authInfo['password'] != md5($_POST['password'])) {
            	$this->error('密码错误!');
            }
            $_SESSION[C('USER_AUTH_KEY')]	=	$authInfo['id'];
//            $_SESSION['email']	=	$authInfo['email'];
//            $_SESSION['loginUserName']		=	$authInfo['nickname'];
//            $_SESSION['lastLoginTime']		=	$authInfo['last_login_time'];
//			$_SESSION['login_count']	=	$authInfo['login_count'];
            if($authInfo['username']=='admin') {
            	$_SESSION['administrator']		=	true;
            }
            //保存登录信息
//			$User	=	M('User');
//			$ip		=	get_client_ip();
//			$time	=	time();
//            $data = array();
//			$data['id']	=	$authInfo['id'];
//			$data['last_login_time']	=	$time;
//			$data['login_count']	=	array('exp','login_count+1');
//			$data['last_login_ip']	=	$ip;
//			$User->save($data);

			// 缓存访问权限
            RBAC::saveAccessList();
			$this->success('登录成功!');

		}
    }
    //可以去例子中复制
    public function loginout(){
        if(isset($_SESSION[C('USER_AUTH_KEY')])) {
			unset($_SESSION[C('USER_AUTH_KEY')]);
			unset($_SESSION);
			session_destroy();
            $this->assign("jumpUrl",__URL__.'/login/');
            $this->success('登出成功!');
        }else {
            $this->error('已经登出!');
        }
    }
}
?>
登入後複製

CommonAction中设置所有url的过滤方法

<?php /**
 * ThinkPHP中的
 * 让其他的Action继承当前的CommonAction就可以了
 */
class CommonAction extends Action{
	//去文档的模型扩展看(_initialize方法可以去例子中查找)
		function _initialize() {
		// 用户权限检查
		if (C ( 'USER_AUTH_ON' ) && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))) {
			import ( 'ORG.Util.RBAC' );
			if (! RBAC::AccessDecision ()) {
				//检查认证识别号
				if (! $_SESSION [C ( 'USER_AUTH_KEY' )]) {
					//跳转到认证网关
					redirect ( PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
				}
				// 没有权限 抛出错误
				if (C ( 'RBAC_ERROR_PAGE' )) {
					// 定义权限错误页面
					redirect ( C ( 'RBAC_ERROR_PAGE' ) );
				} else {
					if (C ( 'GUEST_AUTH_ON' )) {
						$this->assign ( 'jumpUrl', PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
					}
					// 提示错误信息
					$this->error ( L ( '_VALID_ACCESS_' ) );
				}
			}
		}
	}
	
	
	
	public function verify(){
		//导入验证码类
		//方式一:
		import('ORG.Util.Image');
		//方式二:@代表当前项目的lib文件夹(需要自己复制或者自己写一个新的类)
//		import('@.ORG.Image')
//		Image::buildImageVerify();
		
		//扩展修改 
		/**
		 * @param string $length  位数
		 * @param string $mode  类型(0字母,1数字,2大写字母,3小写字母,4中文,5混合)
		 * @param string $type 图像格式
		 * @param string $width  宽度
		 * @param string $height  高度
		 * buildImageVerify($length=4,$mode=1,$type='png',$width=48,$height=22,$verifyName='verify')
		 */
		Image::buildImageVerify(5,5,'png',80,22);
		//中文验证码(2.0会有一个问题:msubstr有错误)
		//1.修改function::msubstr
		//2.加入字体ttf需要放入image同级目录之下
		//扩展可以去类文件中查看
//		Image::GBVerify();
	}
}
?>
登入後複製

Public文件夹下的login。html



<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>



登入後複製
用户名:
密码:



本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
華為GT3 Pro和GT4的差異是什麼? 華為GT3 Pro和GT4的差異是什麼? Dec 29, 2023 pm 02:27 PM

許多用戶在選擇智慧型手錶的時候都會選擇的華為的品牌,其中華為GT3pro和GT4都是非常熱門的選擇,不少用戶都很好奇華為GT3pro和GT4有什麼區別,下面就給大家介紹一下二者。華為GT3pro和GT4有什麼差別一、外觀GT4:46mm和41mm,材質是玻璃鏡板+不鏽鋼機身+高分纖維後殼。 GT3pro:46.6mm和42.9mm,材質是藍寶石玻璃鏡+鈦金屬機身/陶瓷機身+陶瓷後殼二、健康GT4:採用最新的華為Truseen5.5+演算法,結果會更加的精準。 GT3pro:多了ECG心電圖和血管及安

修復:截圖工具在 Windows 11 中不起作用 修復:截圖工具在 Windows 11 中不起作用 Aug 24, 2023 am 09:48 AM

為什麼截圖工具在Windows11上不起作用了解問題的根本原因有助於找到正確的解決方案。以下是截圖工具可能無法正常工作的主要原因:對焦助手已開啟:這可以防止截圖工具開啟。應用程式損壞:如果截圖工具在啟動時崩潰,則可能已損壞。過時的圖形驅動程式:不相容的驅動程式可能會幹擾截圖工具。來自其他應用程式的干擾:其他正在運行的應用程式可能與截圖工具衝突。憑證已過期:升級過程中的錯誤可能會導致此issu簡單的解決方案這些適合大多數用戶,不需要任何特殊的技術知識。 1.更新視窗與Microsoft應用程式商店應用程

undefined和null是什麼意思 undefined和null是什麼意思 Nov 20, 2023 pm 02:39 PM

在JavaScript 中,undefined和null都代表著「無」的概念:1、undefined 表示一個未初始化的變數或一個不存在的屬性,當宣告了一個變數但沒有對其賦值時,這個變數的值就是undefined ,當存取物件中不存在的屬性時,傳回的值也是undefined;2、null表示一個空的物件引用,在某些情況下,可以將物件的引用設為null,以便釋放其佔用的記憶體。

c語言中null和NULL的差別是什麼 c語言中null和NULL的差別是什麼 Sep 22, 2023 am 11:48 AM

c語言中null和NULL的差異是:null是C語言中的一個宏定義,通常用來表示一個空指針,可以用來初始化指針變量,或是在條件語句中判斷指針是否為空;NULL是C語言中的一個預先定義常數,通常用來表示一個空值,用來表示一個空的指標、空的指標數組或是空的結構體指標。

Java API 開發中使用 Auth0 進行身分認證 Java API 開發中使用 Auth0 進行身分認證 Jun 18, 2023 pm 05:30 PM

在現代軟體開發中,身分認證是一項非常重要的安全措施。 Auth0是一家提供身分認證服務的公司,它可以幫助開發者快速實現多種身分認證方式(包括OAuth2、OpenIDConnect等),並提供安全可靠的認證服務。在本文中,我們將介紹如何在JavaAPI開發中使用Auth0進行身份認證。第一步:建立Auth0帳號並註冊應用程式首先,我們需要在

null和undefined有什麼不同 null和undefined有什麼不同 Nov 08, 2023 pm 04:43 PM

null和undefined的差異在:1、語意意義;2、使用場景;3、與其它值的比較;4、與全域變數的關係;5、與函數參數的關係;6、可空性檢定;7、性能考慮;8、在JSON序列化中的表現;9、與類型的關係。詳細介紹:1、語意意義,null通常表示知道這個變數不會擁有任何有效的物件值,而undefined則通常表示變數未被賦值,或物件沒有此屬性;2、使用場景等等。

什麼時候用null和undefined 什麼時候用null和undefined Nov 13, 2023 pm 02:11 PM

null和undefined都表示缺少值或未定義的狀態,根據使用場景的不同,選擇使用null或undefined有以下一些指導原則:1、當需要明確指示一個變數為空或無效時,可以使用null;2、當一個變數已經宣告但尚未賦值時,會被預設為undefined;3、當需要檢查一個變數是否為空或未定義時,使用嚴格相等運算子「===」來判斷變數是否為null或undefined 。

java中null的用法有哪些 java中null的用法有哪些 Mar 01, 2024 am 10:10 AM

用法:1、將引用類型的變數初始化為null,表示該變數目前不指向任何物件;2、將引用類型的變數設為null,可以釋放該變數所引用的物件的記憶體空間,幫助垃圾回收器回收該物件;3、使用null來檢查一個引用是否為空,可以透過判斷引用是否為null來避免NullPointerException異常的發生;4、在條件判斷中使用null,可以判斷某個引用是否為空。

See all articles