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>

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

为什么截图工具在Windows11上不起作用了解问题的根本原因有助于找到正确的解决方案。以下是截图工具可能无法正常工作的主要原因:对焦助手已打开:这可以防止截图工具打开。应用程序损坏:如果截图工具在启动时崩溃,则可能已损坏。过时的图形驱动程序:不兼容的驱动程序可能会干扰截图工具。来自其他应用程序的干扰:其他正在运行的应用程序可能与截图工具冲突。证书已过期:升级过程中的错误可能会导致此issu简单的解决方案这些适合大多数用户,不需要任何特殊的技术知识。1.更新窗口和Microsoft应用商店应用程

第1部分:初始故障排除步骤检查苹果的系统状态:在深入研究复杂的解决方案之前,让我们从基础知识开始。问题可能不在于您的设备;苹果的服务器可能会关闭。访问Apple的系统状态页面,查看AppStore是否正常工作。如果有问题,您所能做的就是等待Apple修复它。检查您的互联网连接:确保您拥有稳定的互联网连接,因为“无法连接到AppStore”问题有时可归因于连接不良。尝试在Wi-Fi和移动数据之间切换或重置网络设置(“常规”>“重置”>“重置网络设置”>设置)。更新您的iOS版本:

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

在JavaScript 中,undefined和null都代表着“无”的概念:1、undefined 表示一个未初始化的变量或一个不存在的属性,当声明了一个变量但没有对其赋值时,这个变量的值就是undefined,访问对象中不存在的属性时,返回的值也是undefined;2、null表示一个空的对象引用,在某些情况下,可以将对象的引用设置为null,以便释放其占用的内存。

在现代软件开发中,身份认证是一项非常重要的安全措施。Auth0是一家提供身份认证服务的公司,它可以帮助开发者快速实现多种身份认证方式(包括OAuth2、OpenIDConnect等),并提供安全可靠的认证服务。在本文中,我们将介绍如何在JavaAPI开发中使用Auth0进行身份认证。第一步:创建Auth0账号并注册应用首先,我们需要在

null和undefined的区别在:1、语义含义;2、使用场景;3、与其它值的比较;4、与全局变量的关系;5、与函数参数的关系;6、可空性检查;7、性能考虑;8、在JSON序列化中的表现;9、与类型的关系。详细介绍:1、语义含义,null通常表示知道这个变量不会拥有任何有效的对象值,而undefined则通常表示变量未被赋值,或者对象没有此属性;2、使用场景等等。

null和undefined都表示缺少值或未定义的状态,根据使用场景的不同,选择使用null还是undefined有以下一些指导原则:1、当需要明确指示一个变量为空或无效时,可以使用null;2、当一个变量已经声明但尚未赋值时,会被默认设置为undefined;3、当需要检查一个变量是否为空或未定义时,使用严格相等运算符“===”来判断变量是否为null或undefined。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
