SpeedPHP/权限控制

来自站长百科
跳转至: 导航、​ 搜索

SpeedPHP | 快速入门 | 访问交互 | 数据操作 | 框架概述 | 模板引擎 | 优化加速 | 开发指南 | 数据模型 | API参考

本条目介绍SpeedPHP的权限控制——spAcl扩展的使用方法。

spAcl介绍[ ]

spAcl是通过读取角色权限列表,在路由前扩展点位置,判断当前角色是否可以访问当前页面程序,执行放行或拒绝转向。这里Acl可以总结成三部分:

  • 拥有一张角色权限表数据,记录各页面的权限和对应的角色。
  • 通过框架扩展点执行,保证未执行用户级代码前进行权限判断,保证安全;同时免除用户级代码参杂权限控制器代码,让代码更清晰、可控。
  • 判断角色是否拥有权限时,可使用spAcl的“强制控制”或“有限控制”,分别适用不同的权限控制需要。

“强制控制”是最大程度控制,也就是“只有——有权限的角色——才可以访问”,比如大部分的后台程序或者企业内部办公系统,除了登录页面外,其他的功能都要登录验证身份后才能使用。

“有限控制”是仅限于列表中的页面才需要验证权限,也就是“除非——有权限要求的页面——才需要验证”。例如简单如留言本,任何人都是可以留言的,但是如果是删除留言的操作,那么仅能由留言本的主人才能执行了。

“有限控制”[ ]

有限控制是比较简单的权限控制模式,也就是当某个页面被权限表声明为“需要某权限才能进入”,那么这个页面才会被保护起来。

SpeedPHP spacl 1.jpg

使用方式[ ]

1. 入口文件设置扩展点

'launch' => array( 
	 'router_prefilter' => array( 
		array('spAcl','mincheck') // 开启有限的权限控制
	 )
 ),

2. 建立权限记录表——acl表,如果程序设置了表前缀,请建立“表前缀+acl”为名称的权限表(如pubgb_acl)

CREATE TABLE acl
(
	aclid int NOT NULL AUTO_INCREMENT,
	name VARCHAR(200) NOT NULL,
	controller VARCHAR(50) NOT NULL,
 	action VARCHAR(50) NOT NULL,
 	acl_name VARCHAR(50) NOT NULL,
 	PRIMARY KEY (aclid)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci

3. 在“有限控制”的情况下,在权限表中的每一条记录,都代表了一个“限制”——相对来说,没有记录就没有“限制”。

INSERT INTO `pubgb_acl` VALUES ('1', '留言管理后台', 'admin', 'index', 'GBADMIN');
INSERT INTO `pubgb_acl` VALUES ('2', '删除留言', 'admin', 'del', 'GBADMIN');
INSERT INTO `pubgb_acl` VALUES ('3', '提交留言', 'main', 'post', 'GBUSER');
INSERT INTO `pubgb_acl` VALUES ('4', '提交留言', 'main', 'post', 'GBADMIN');
  • 任意访问者:其他全部控制器/动作页面
  • GBUSER:其他全部控制器/动作页面,main/post
  • GBADMIN:其他全部控制器/动作页面,main/post,admin/index,admin/del

比如这里设置了 admin/index 页面只能由角色“GBADMIN”进入,那么,在当前访问者没有赋予角色“GBADMIN”,那么访问者在访问admin/index的时候,将会收到警告信息并返回首页。

4. 怎么为当前访问者赋予角色呢?很简单,通过spClass('spAcl')->set("GBADMIN");进行赋值即可。如:

<?php
class main extends spController
{
	function index(){
		if( 'jake' == $this->spArgs('inputname') && '123456' == $this->spArgs('inputpass') ){
			spClass('spAcl')->set("GBADMIN"); // 对当前访问者(SESSION)赋予THEADMIN角色
			$this->jump(spUrl('admin', 'index')); // 跳转到admin/index
		}
		header("Content-type: text/html; charset=utf-8");
		echo '<form action="'.spUrl('main', 'index').'" method="post">用户:<input type="text" /><br />密码:<input type="text" />
 <br /><input type="submit" value="提交" /><br /></form>';
	}
}
?>

这里的表单直接提交,判断用户名和密码正确后,对当前访问者赋予了GBADMIN角色,然后就可以跳转到admin/index页面上执行了。

浏览器关闭,或者执行spClass('spAcl')->set("");的时候,将取消当前访问者的角色,也就是退出登录了。

“有限控制”的流程图如下:

SpeedPHP spacl 2.jpg

“强制控制”[ ]

强制控制是比较严格的权限控制模式,默认情况下,任何的页面都会被保护起来,访问者只有在被赋予某种角色的时候,才允许访问该角色“允许访问”的页面——也就是该角色在权限表中“明确”指明“可访问”的页面,而其他的页面,还是不允许访问。

“任何角色可进入”的控制器/页面[ ]

由于强制控制的情况下,访问者还是需要在某个页面进行登录等操作,才开始被赋予角色并通行系统,所以,需要将登录表单、错误提示等页面,设置成“任何角色可进入”。

在权限记录中,“任何角色可进入”的记录会如下标识:

INSERT INTO `pubgb_acl` VALUES ('5', '首页', 'main', 'index', 'SPANONYMOUS');
INSERT INTO `pubgb_acl` VALUES ('6', '登录', 'main', 'login', 'SPANONYMOUS');

指代是的“main/index”(首页)、“main/login”(登录)等页面,是任何人都可以访问的。

所以,如果访问者在没有被赋予角色前访问系统,那么将会弹出错误提示,并且转向到“main/login”进行登录操作。

对比有限控制,强制控制是比较严格的权限控制模式,拒绝一切未经授权的访问,只有具备某权限的角色,才能访问对应的页面。

SpeedPHP spacl 3.jpg

通常,强制控制是用在“后台”类型的系统中,比如说公司内部OA系统,报表系统等。

INSERT INTO `pubgb_acl` VALUES ('1', '留言管理后台', 'admin', 'index', 'GBADMIN');
INSERT INTO `pubgb_acl` VALUES ('2', '删除留言', 'admin', 'del', 'GBADMIN');
INSERT INTO `pubgb_acl` VALUES ('3', '提交留言', 'main', 'post', 'GBUSER');
INSERT INTO `pubgb_acl` VALUES ('4', '提交留言', 'main', 'post', 'GBADMIN');
INSERT INTO `pubgb_acl` VALUES ('5', '首页', 'main', 'index', 'SPANONYMOUS');
INSERT INTO `pubgb_acl` VALUES ('6', '登录', 'main', 'login', 'SPANONYMOUS');
INSERT INTO `pubgb_acl` VALUES ('7', '查看留言', 'main', 'view', 'SPANONYMOUS');
INSERT INTO `pubgb_acl` VALUES ('8', '登出', 'main', 'logout', 'SPANONYMOUS');

从上面的记录可以看到:

  • “任何角色可进入”:main/index,main/login,main/view,main/logout
  • GBUSER:main/index,main/login,main/view,main/logout,main/post
  • GBADMIN:main/index,main/login,main/view,main/logout,main/post,admin/index,admin/del

因为是“强制控制”,“只有——有权限的角色——才可以访问”,所以在权限记录中“明确声明”可以让当前角色进入的页面之外,当前角色都不可以访问。

使用方式[ ]

1. 入口文件设置扩展点

'launch' => array( 
	 'router_prefilter' => array( 
		array('spAcl','maxcheck') // 开启强制的权限控制
	 )
 ),

注意,“强制控制”是“maxcheck”,对比“有限控制”是“mincheck”。

2. 设置“任何角色可进入”的页面。这里设置了main/index,main/login,main/view,main/logout为“任何角色可进入”。

3. 设置错误提示

'ext' => array( // 扩展设置
	'spAcl' => array( // acl扩展设置
		'prompt' => array("lib_user", "acljump"),
	), 
)

4. 为GBUSER,GBADMIN设置权限记录,还是用之前的表,只不过换了记录。

这里可以看到,以下页面GBUSER角色是可以执行的:

GBUSER:main/index,main/login,main/view,main/logout,main/post

而以下的页面,GBUSER角色就无法执行了

admin/index,admin/del

“强制控制”流程图如下:

SpeedPHP spacl 4.jpg

参考来源[ ]

http://speedphp.com/manual.html

SpeedPHP使用手册导航

快速入门

开始使用SpeedPHP | 制作留言本 | 简便的数据表操作 | 用Smarty来显示页面

访问交互

入口文件 | 控制器架构 | 网址生成与PATH_INFO | 获取提交数据 | URLRewrite伪静态 | 自定义伪静态URL | 几种跳转 | 多语言实现 | 权限控制 | session、cookie | Ajax应用

数据操作

编写数据模型类 | 常规操作CRUD | 安全过滤 | 简化操作spDB | 数据变量存储 | 缓存配置

框架概述

单入口应用程序 | 架构设计 | 第三方类库及扩展功能 | UTF8编码与GBK版本 | SAE云计算版

模板引擎

模板引擎配置 | 使用Smarty | Smarty开发教程 | 自动显示模板| speedy教程 | 为什么使用模板其常见问题 | 模板包含文件 | 注册函数 | 全局变量赋值 | CSS和JS的路径

优化加速

生成静态HTML概述 | 生成HTML的使用 | 分页 | 高效函数缓存器| 模板引擎缓存

开发指南

核心函数 | 格式输出变量调试dump | 载入包含文件import | 类实例化函数spClass | 开发流程 | 目录结构、路径设置 | 大规模系统部署 | 用户自定义及全局操作 | 自定义函数库 | 自定义类库 | 自定义404页面 | 程序调试dump变量调试安全建议及命名建议

数据模型

高级数据库操作 | 数据表一对一关联 | 数据表一对多关联 | 数据表多对多关联 | 一表关联多表 | 关联结果的条件限制 | 关联结果在Smarty模板中显示 | 多数据库、数据表 | 多种类型数据库的配置 | 重写CRUD操作| 业务数据封装 | 数据函数复合调用

API参考

spModel数据库操作类 | spPager分页类 | spVerifier数据验证类 | spCache函数数据缓存类 | spLinker数据表关联实现类 | spView视图类 | spHtml静态HTML生成类 | spController控制器类 | spArgs环境参数类 | 配置 | 数据库驱动类 | 模板驱动类 | import载入文件