ThinkPHP安全体系-委托认证和决策访问和RBAC
企业级的应用是离不开安全保护的,ThinkPHP以基于Spring的Acegi安全系统作为参考原型,并做了简化,以适合目前的ThinkPHP结构,提供了一个多层的、可定制的安全体系来为应用开发提供安全控制。安全体系中主要有:
安全拦截器
认证管理器
决策访问管理器
运行身份管理器
安全拦截器
安全拦截器就好比一道道门,在系统的安全防护系统中可能存在很多不同的安全控制环节,一旦某个环节你未通过安全体系认证,那么安全拦截器就会实施拦截。
认证管理器
防护体系的第一道门就是认证管理器,认证管理器负责决定你是谁,一般它通过验证你的主体(通常是一个用户名)和你的凭证(通常是一个密码),或者更多的资料来做到。更简单的说,认证管理器验证你的身份是否在安全防护体系授权范围之内。
访问决策管理
虽然通过了认证管理器的身份验证,但是并不代表你可以在系统里面肆意妄为,因为你还需要通过访问决策管理这道门。访问决策管理器对用户进行授权,通过考虑你的身份认证信息和与受保护资源关联的安全属性决定是是否可以进入系统的某个模块,和进行某项操作。
例如,安全规则规定只有主管才允许访问某个模块,而你并没有被授予主管权限,那么安全拦截器会拦截你的访问操作。
决策访问管理器不能单独运行,必须首先依赖认证管理器进行身份确认,因此,在加载访问决策过滤器的时候已经包含了认证管理器和决策访问管理器。
为了满足应用的不同需要,ThinkPHP在进行访问决策管理的时候采用两种模式:登录模式和即时模式。
登录模式,系统在用户登录的时候读取改用户所具备的授权信息到Session,下次不再重新获取授权信息。也就是说即使管理员对该用户进行了权限修改,用户也必须在下次登录后才能生效。
即时模式就是为了解决上面的问题,在每次访问系统的模块或者操作时候,进行即使验证该用户是否具有该模块和操作的授权,从更高程度上保障了系统的安全。
运行身份管理器
运行身份管理器的用处在大多数应用系统中是有限的,例如某个操作和模块需要多个身份的安全需求,运行身份管理器可以用另一个身份替换你目前的身份,从而允许你访问应用系统内部更深处的受保护对象。这一层安全体系目前的RBAC中尚未实现。
要启用RBAC请在项目配置文件中设置
USER_AUTH_ON 为True
并设置认证类型USER_AUTH_TYPE
1 普通认证(认证一次)
2 高级认证(实时认证)
不设置默认为1
例如,下面的设置可供参考
代码: 复制内容到剪贴板
1. return array(
2. 'USER_AUTH_ON'=>true,
3. 'USER_AUTH_TYPE' => 1,
4. 'USER_AUTH_KEY' => 'authId',
5. 'USER_AUTH_PROVIDER' => 'DaoAuthentictionProvider',
6. 'USER_AUTH_GATEWAY' => '/Public/login',
7. 'NOT_AUTH_MODULE' => 'Public',
8. 'REQUIRE_AUTH_MODULE'=> '',
9. );
认证识别号USER_AUTH_KEY 是用于检查用户是否经过身份认证的标识,一旦用户经过系统认证,系统会把该用户编号保存在$_SESSION[C('USER_AUTH_KEY')]中
为了满足应用系统的需要,RBAC插件中可以设置
REQUIRE_AUTH_MODULE 需要认证的模块
NOT_AUTH_MODULE 无需认证的模块
多个模块之间用逗号分割
如果某个模块需要认证,但是用户还没有经过身份认证,就会跳转到
USER_AUTH_GATEWAY 认证网关,例如 /Public/login
验证地址就是: 项目入口文件URL地址/Public/login
假设认证网关的验证操作地址是/Public/CheckLogin,可以在public模块的checkLogin操作中采用如下方式进行认证:
代码: 复制内容到剪贴板
1. 2. // 生成认证Map条件
3. // 这里使用用户名、密码和状态的方式进行认证
4. $map = array();
5. $map["name"] = $_POST['name'];
6. $map["password"] = $_POST['password'];
7. $map["status"] = 1;
8. $authInfo = RBAC: : authenticate($map);
9. if(false === $authInfo) {
10. $this->error('登录失败,请检查用户名和密码是否有误!');
11. }else {
12. // 设置认证识别号
13. $_SESSION[C('USER_AUTH_KEY')] = $authInfo['id'];
14. //获取并保存用户访问权限列表
15. RBAC: :saveAccessList();
16. // 登录成功,页面跳转
17. $this->success('登录成功!');
18. }
19. ?>
RBAC的委托认证方法
代码: 复制内容到剪贴板
1. authenticate($map,$model='User',$provider=USER_AUTH_PROVIDER)
方法是静态方法,支持三个参数,其中第一个认证条件$map是必须的,可以灵活地控制需要认证的字段。
第二个参数是进行认证的模型类,默认是UserModel类
第三个参数是委托方式 由 USER_AUTH_PROVIDER 设置委托认证管理器的委托方式,目前支持的是 DaoAuthentictionProvider 通过数据库进行认证。
在应用系统的开发过程中,只需要设置相关的配置项和添加上面的认证方法,其他的认证和决策访问就由RBAC组件的AccessDecision方法自动完成了。
系统会在执行某个模块的操作时候,首先判断该模块是否需要认证,如果需要认证并且已经登录,就会获取当前用户的权限列表判断是否具有当前模块的当前操作权限,并进行相应的提示。
接下来就是在框架总后台设置相关项目的模块和操作权限了。
关于如何授权请参考示例中心提供的RBAC示例
首先,在节点管理添加相关项目、模块和操作,作为权限管理的节点。
如果需要设置公共的操作,可以使用Public模块,所有属于Public模块的操作对所有模块都有效。
添加完成项目管理节点后,就在权限管理里面对某个用户组设置相关权限(包括项目权限、模块权限和操作权限)
以后需要授权就把用户添加到某个权限组就可以了,同一个用户可以属于多个权限组。
授权和认证功能涉及到四个数据表,DB_PREFIX为配置文件中设置的数据库前缀
DB_PREFIX_group 权限组表
DB_PREFIX_groupuser 组-用户关联表
DB_PREFIX_access 访问权限表
DB_PREFIX_node 权限节点表
所谓的授权操作其实就是往DB_PREFIX_groupuser表和DB_PREFIX_access里面写入数据
至于数据表的字段官方给出的示例仅供参考,可以通过修改ORG.RBAC.AccessDecisionManager 类来完成项目的需要
SEO工具、SEO教程、SEM教程、SEO培训、SEO优化、SEO服务、SEM服务等方面的资料,让大家掌握更多搜索引擎优化、网站优化等方面的知识。
关注者
博客归档
-
▼
2008
(128)
-
▼
十一月
(127)
- 导致网站进沙盒的真正原因
- 单向链接对SEO意义和价值
- 网页title长度解密
- 淘宝网robots.txt拒绝百度蜘蛛抓取,抵制百度
- 中搜对百度采取屏蔽措施
- JavaScript对SEO的影响和处理办法
- 百度召开紧急会议应对央视“曝光门”
- 百度受央视曝光影响周一股价大跌25%
- 关键字“小事”做到百度排名第一的
- SEO实际运用-网站编辑
- 黑帽SEO是什么?
- SEO探索-seo与网站结构的关系
- 从SEO原则看网站优化
- 不用 SEO取得成功的10个步骤
- 百度排名NO.1是怎样SEO成功的?
- 搜索引擎如何给你的网站内容打分
- 网站建设中标题和页面描述的撰写技巧
- 三年站长生涯收入80万的实战总结
- 长尾搜索可能比预料得还要长
- 网站关键字热门与时效性的测试
- 巧用seo获得上万流量的技巧
- 谈谈国外网站赚钱的要诀
- 百度图片SEO:让流量在翻番
- Site网址首页不在第一位的原因
- 有效增加反向链接的5个方法
- 告诉你24种提高网站关键字排名的SEO技巧
- 有利于网站排名的设计建议
- seoer你该怎么学习你的竞争对手?!
- 超强外链提高pr资源共享!
- 10种在SEO之外获得网站流量的方式(译)
- 最权威的Google排名算法解密
- 卖什么又省心又容易赚钱
- 网站赚钱就靠广告行不行?
- 网站美观重要还是实用重要?
- 中文网站设计通病
- SEO难学的那部分
- 从SEO角度看网站重新设计
- 复制内容网页是怎样形成的?
- 搜索引擎统一Robots文件标准
- 用户体验与SEO
- robots.txt详细介绍
- SEO作弊的含义与常见方式
- 强势推出“评测网站的十个指标”
- Google官方针对网站SEO的建议
- 搜索引擎中文分词技术
- 如何避免中小企业提升网络营销成功率五大误区
- 网络营销相对传统营销有哪些优势?
- 为什么要建立网站地图?
- 网站被百度K了怎么办?
- 搜索引擎排名算法中必不可少的要素
- 揭秘影响Google排名的主要因素
- 中国SEO的前景如何?
- 什么是反向链接?
- Google优化圣经
- 搜索引擎排名算法中必不可少的要素
- 怎样为有内容的网站创建良好的用户体验?
- SEO优化的主要环节和步骤包括哪些方面?
- 网站更换新域名,怎样才不会影响原有排名?
- 网站排名下降的主要原因
- 搜索引擎对网站重复内容的看法及建议
- 链接架构的重要性
- 常见的SEO术语
- 目前最完美解决QQ卸载彩虹的方法
- 服务器对网站排名的影响
- .NET语言的选择
- .Net的精髓-XML和SOAP
- ASP.Net的几大热点问题
- Windows.NET Server: 远程访问
- 技术分析:.NET的优势与劣势
- 微软下一代网络服务器IIS7前瞻
- 代码大战:哪种语言会赢得开发的霸权?
- 技术分析:.NET的优势与劣势
- 用不着妄自菲薄 对ASP和ASP程序员的一些话
- 从本质上看网页(asp,jsp)的编写
- 一个用ASP生成html的新方法
- 一个基于web的QQ程序 2(xml+asp)
- PHP5的 SPL
- 连续正整数 算法实现
- 深入学习memcached
- php在apache中安装模式的区别:fastcgi和mod_php
- PHP与WEB服务工作的三种方式
- 深入PHP编译缓存
- 编译PHP手册的新办法
- 用于解决PHP 命名空间分隔符输入问题的USB设备
- 再论代码之美——PHP实战
- php 时间差8小时解决
- 自动编码转换
- ThinkPHP安全体系-委托认证和决策访问和RBAC
- 从URL路由、空操作和空模块看ThinkPHP对SEO的支持
- 模型自动验证和处理
- 多数据库支持
- 值得关注的ThinkPHP特性2:分布式数据库支持
- 讲解一个经过高手优化的MySQL数据库实例
- ASP实现网站智能分词搜索
- 编写简单的中文分词程序
- 中文分词搜索,asp拆词搜索,asp智能分词搜索
- 用存储过程实现删除数据表的部分记录
- MySQL存储过程SAVEPOINT ROLLBACK to
- 用一个存储过程实现分步删除数据表记录
- DB2数据库创建存储过程时遇到的错误现象
-
▼
十一月
(127)
没有评论:
发表评论