当前位置:  开发笔记 > 编程语言 > 正文

PHP会员权限控制-很详细(转)

我的通用权限系统设计是更换权限时候尽量不要涉及到代码修改,来自chinaunix论坛,今天转过来看看。希望对大家有所帮助,对PHP100的朋友有个很高的提升。部分代码我们会上传到bbs.php100.com论坛/**控制访问表*acl值功能*1需要登录*2自身修改*4">

  我的通用权限系统设计是更换权限时候尽量不要涉及到代码修改,来自chinaunix论坛,今天转过来看看。希望对大家有所帮助,对PHP100的朋友有个很高的提升。部分代码我们会上传到bbs.php100.com 论坛

  /*

  *控制访问表

  * acl值 功能

  * 1 需要登录

  * 2 自身修改

  * 4 需要组的权限集合

  * 8 需要身份访问集合

  * 16 身份被禁止访问

  * 32 可访问的日期

  * 64 可访问的周日

  * 128 可访问的时间

  * 256 输入密码才能访问

  * 512 超级管理使用

  */

  class aclACL extends acl {

  public $routername="acl";

  public $aclid='2'; //权限资源ID,如果登录人员没有拥用这个权限那么其(下面)它值都为0也不能访问

  public $roledisable=array(9); //禁用身份

  public $pwd=123456; //密码访问 ACL->noPwd();

  public $date=array('begin'=>0,'end'=>0); //允许日期之间

  public $hours=array('begin'=>0,'end'=>0); //一日内小时区间

  public $weeks=array('begin'=>0,'end'=>0); //一周内周一到周七

  public $aclgroup=array("create"=>"4,45,8"); //create需要的组才能创建

  public $aclrole=array("all"=>"6","create"=>"7,95,78"); //create需要的角色才能创建,该组需要ID为6的角色才能访问

  public $acl=array("all"=>0,

  "index"=>4, //表列4表示检查组的组合

  "delete"=>1, //删除只登录后删除,当然呆以设置为2或4

  "update"=>1, //更新提交只能登录后才能更新,在这里做也防止非法、post,edit是不能访问显示编辑内容页

  "createForm"=>1, //也不能新提交数据库

  "edit"=>0, //登录才显示编辑框

  "show"=>0, //不用登录也能显示

  "create"=>1); //创新表单需要登录操作 可以设置某个组才能创建

  }

  ?>

  这个是要认证的文件模块是acl

  每当用户访问acl模块时候,如果开启了认证那么会调用这个类

  然后这个类会根据$acl 的all或index等值去做认证检查。

  把这个文件放在router/acl目录里面就可以了,框架会自动认证如果用户没有相应的正向授权是无法访问相应的限制的。

  比如crud create方法 负向权限为17 那按照前面解释应该是 需要登录和组授权 就是$aclgroup 数组中create的4 45 8三个组,

  首先会员没有登录将提示登录,如果会员不在这三个组是无法访问该方法的会提示没有权限。

  目前router可以自己根据情况开启用acl控制

  方法是在xxxxRouter.class.php文件中 添加 public function isAcl(){}

  可以返回权限文件名比如返回curd,那么自动会调用curdACL.class.php类和名

  curdRouter类设置验证

  class curdRouter extends controller{

  //返回 RBAC 控制访问列表验证类默认是跟router同名也就是curd

  //可以不写这个函数,那么不会启用通用权限系统。

  public function isAcl(){}

  public function index()

  {

  $booktype=M("booktype");

  $this->pager=C("pager");//取得分类

  $this->pager->setPager($booktype->count(),10,'page');//取得数据总数中,设置每页为10

  $this->assign("list",$booktype->orderby("bookid desc")->limit($this->pager->offset(),10)->fetch()->getRecord());

  }

  public function login(){ //登录页面

  }

  public function logout(){ //退出页面

  MY()->logout(); //退出登录

  redirect(url_for("guestbook/index"),"退出成功",3);

  }

  public function noAcl($mask) { //处理一下如果没有权限转向登录

  redirect(url_for("guestbook/login"),"需要登录",3);

  }

  public function loginpost() { //登录提交地方 简单处理下登录认证

  if($_POST['author']=='queryphp'&&md5($_POST['pwd'])==md5('123456'))

  {

  MY()->setLogin(); //设置登录状态

  redirect(url_for("guestbook/adminlist"),"登录成功",3);

  }

  redirect(url_for("guestbook/login"),"登录失败",3);

  }

  

  /*

  *登录信息基本类

  *权限表可以缓存数据,登录时候恢复。

  */

  class mybase {

  public $optiOns=array();

  public $uid;

  public $username;

  public $isadmin;

  public $role=array(); //我使用的身份

  public $group=array(); //我所在组

  public $grouprole=array(); //组的身份

  public $mygroupMar=array(); //我拥有管理的组

  public $mygroupOwn=array(); //属于我的组

  public $acl=array(); //主动控制表 groupacl和myacl控制权限集合 内容是rbac的rbacid

  public $groupacl=array(); //组拥用的控制权限

  public $myacl=array(); //我的身份拥用的控制权限

  public $loginfaild=0; //登录失败次数 如果超过这个数应该禁止IP登录几分种

  这是基本

  可以把myUser.class.php放在项目lib目录里面

  使用MY()函数就可以取得myUser了。

  

curd6.gif

 

  

rbac.png

 

  

rbac-2.gif


推荐阅读
  • 为了在Fragment中直接调用Activity的方法,可以通过定义一个接口并让Activity实现该接口来实现。具体步骤包括:首先在Fragment中声明一个接口,并在Activity中实现该接口。接着,在Fragment中通过类型转换检查Activity是否实现了该接口,如果实现了则调用相应的方法。这种方法不仅提高了代码的解耦性,还增强了模块间的通信效率。此外,还可以通过ViewModel或LiveData等现代Android架构组件进一步优化这一过程,以实现更加高效和可靠的通信机制。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • Prim算法在处理稠密图时表现出色,尤其适用于边数远多于顶点数的情形。传统实现的时间复杂度为 \(O(n^2)\),但通过引入优先队列进行优化,可以在点数为 \(m\)、边数为 \(n\) 的情况下显著降低时间复杂度,提高算法效率。这种优化方法不仅能够加速最小生成树的构建过程,还能在大规模数据集上保持良好的性能表现。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • 开发日志:磁盘读取技术详解——CHS模式的应用与解析
    开发日志:磁盘读取技术详解——CHS模式的应用与解析 ... [详细]
  • 深入浅出:前端开发中的JavaScript基础入门
    JavaScript,作为前端开发的核心技术之一,与HTML和CSS并称为Web开发的三大基石。尽管其名称与Java相似,但实际上两者并无直接关联,JavaScript是一门独立的编程语言,与Python、Go和C++等语言一样具有独特的语法和特性。本文将从基础入手,详细介绍JavaScript的基本概念、语法结构及其在现代Web开发中的应用。 ... [详细]
  • GoCD 创建管道时遇到 422 错误:权限不足问题分析与解决
    在 GoCD 创建管道时遇到 422 错误,通常是因为反向代理配置不正确,特别是缺少必要的头部信息。具体来说,需要确保在反向代理配置中添加 `proxy_set_header Host $host;` 和 `proxy_set_header X-Real-IP $remote_addr;` 等关键指令,以确保 GoCD 能够正确识别请求来源并进行权限验证。通过调整这些配置,可以有效解决权限不足的问题,确保管道创建过程顺利进行。 ... [详细]
  • 池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析
    池子比率:BSV 区块链上的去中心化金融应用——Uniswap 分析 ... [详细]
  • Sapphire 测试网上线:首个支持 EVM 的隐私 ParaTime 环境
    Sapphire 测试网上线:首个支持 EVM 的隐私 ParaTime 环境 ... [详细]
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
  • 在运行时动态获取Entity Framework中的ObjectSet可以通过反射机制实现。这种方法允许开发者在应用程序运行期间根据需要加载不同的实体集合,从而提高代码的灵活性和可扩展性。通过使用`DbContext`类的`Set`方法,结合类型信息,可以轻松地实现这一目标。此外,还可以利用`Type`对象和泛型方法来进一步增强动态性,确保在处理多种实体类型时更加高效和安全。 ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 在 DevCon 4 上,演讲者深入探讨了 Serenity 中的点对点网络架构。该演讲详细解析了 Serenity 网络协议的设计原理与实现细节,涵盖了节点发现、数据传输及安全性等方面的关键技术。通过丰富的案例和图表,演讲者全面展示了 Serenity 网络的高效性和可靠性。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
author-avatar
欢乐文艺女青年
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有