yii2授权之ACF

授权是指验证用户是否允许做某件事的过程,在yii2中中简单来讲就是是否允许某类访客是否能访问某个controller或者是其下的action。想一个这样的场景,一个师生交互平台,分为三部分:管理员,教师,学生。那在登录时,肯定要限制防止不同身份的访客登录不对称的页面,比如管理员只能登陆后台的管理页面,而其他身份的访客则不能登录了。

在yii2中提供两种授权管理途径
         (1)ACF存取控制授权(较为简单,适合访客权限设置简单的情景)
 (2)RBAC基于角色的存取授权控制(较为复杂,适合博客,论坛等大型网站)
      本文只说ACF,RBAC以后再说。

ACF授权管理
    1简介:
       在yii2中存取控制过滤器(ACF)是一种通过 yii\filters\AccessControl 类来实现的简单授权方法,非常适用于仅需要简单的存取控制的应用。ACF本质上来说就是一个过滤器 filter,可在控制器或者模块中使用。它的原理,其实就是添加了一个过滤器,在设置了AFC后,访问这个action之前就必须先经过这个过滤器,要是没有相应的权限,则会被打回,提示错误等。就像是洗米时的筛子。

2.如何设置ACF:
      要知道yii2设计网页存放在view文件中,而要想访问网页就必须通过访问对应controller下对应渲染页面的action所以在对页面进行访问限制时,我们实际上是通过限制对应的action实现的。ACF正是如此。比如我们需要在SiteController中限制 index 只能为登录用户使用的话可以这样写首先在SiteController 文件最上面声明引用yii2中的类 use yii\filters\AccessControl;然后在SiteController类中添加一个函数 behaviors()

 public function behaviors(){return ['access'=>['class' => AccessControl::className(),'rules' => [['actions' => ['index','login'],'allow' => true,'roles' => ['?'],],['actions' => ['contact','about'],'allow' => true,'roles' => ['@'],]],],];}

解读代码:看到behaviors你会想到什么,yii2中的三大特色 属性 事件 行为 中的行为吧!  对!没有错,behaviors()函数正是返回一个行为,这也能说明为什么这个函数return了一个关于类信息的数组,这是因为系统会将return得到的类信息用来生成一个对应的对象 因为这个类是一个继承bahavior的类,所以他的对象可以绑定到任何一个继承component类的子类身上。也就是说yii2框架系统会自动将behaviors()函数中获得指定的过滤器类。从而生成对应的过滤器对象,然后绑定在SiteController类上这样一来,SiteController类生成的对象都会绑定一个该类型的过滤器对象。再通俗点讲的话,就是系统将通过behaviors()生成的对象与SiteController对象合二为一了,这样SiteController自然而然就由来过滤器的一些功能了。所以该controller便被设置了ACF权限限制了。 也就是说 yii2框架是通过为控制器Controller 绑定一个继承行为behavior的过滤器类来扩充控制的功能。

好思路上总结完了,接下来我们讲一下细节以及函数bahaviors的参数。
 'access' 猜也猜的出是指 AccessControl 的ID,其实就是说要生成的这个controller的id是access
 'class' => AccessControl::className(),就是声明生成这个对象的类的路径就是我们之前引进的类yii\filters\AccessControl 。所以这个AccessControl::className()
 可以直接用yii\filters\AccessControl代替的。
 'rules'是AccessControl类中定义的权限验证验证规则,其实这个rules数组中还少了一行 类声明,'class' => 'yii\filters\AccessRule',
 但是在AccessControl是会为她补齐的。所以可有可无。
 其中的 'action'=>[ ] 表示要验证的action ID   要是为空则默认所有的action
 'allow'=>true 表示允许 false表示不允许
 'roles'=>['?'] 表示何种访客  ?表示未登录的游客, @表示已经登录的用户  还可以是RBAC中定义的角色(在此省略)

所以上面的一部分代码如下:

 ['actions' => ['index','login'],'allow' => true,'roles' => ['?'],
],

解释:允许未登录的游客访问action ID为 index login的action

['actions' => ['contact','about'],'allow' => true,'roles' => ['@'],
]

解释:只允许已经登录的用户访问action ID为contact about的action 其他禁止。

当然ACF还可以有其一些属性和方法的设置:

public function behaviors()
{return ['access'=>['class' => AccessControl::className(),'only' => ['index','login','contact','about'],'except' => ['update'],'denyCallback' => function($rule, $action){throw new ForbiddenHttpException("自己定义错误提示");},'rules' => [['actions' => ['index','login'],'allow' => true,'roles' => ['?'],],['actions' => ['contact','about'],'allow' => true,'roles' => ['@'],]],],];}

解释:
      'only'=>[] 一次性指明,那些action受AccessControl的限制
      'except' => [] 指明那些action可以不受AccessControl的限制
      如果一个actionID同时出现在only和except中,这个actionID不受本ActionFilter约束
      'denyCallback' 拒绝回调函数,当验证权限不通过被拒绝时,会触发该函数,我们在其中填写属于自己的错误提示。甚至可以在里面添加代码,做一些跳转页面的事情。例如我这样写,情景:设定只有管理员身份的用户才能访问,普通用户提示"您没有权限访问这个网页",游客跳转到登陆界面。

'denyCallback' => function($rule, $action){if (\Yii::$app->user->isGuest){\Yii::$app->user->loginRequired();//游客跳转到登陆界面}elsethrow new ForbiddenHttpException("您没有权限访问这个网页");//普通用户提示"您没有权限访问这个网页"}

要是我们没有写denyCallback 系统将分类处理
(1)未登录的游客则将调用yii\web\User::loginRequired()将用户的浏览器重定向到登录页面
(2)已登录的用户则调用AccessControl中denyAccess()将抛出一个yii\web\ForbiddenHttpException异常
所以一般建议使用,错误信息这种机密的东西还是自己设置吧!

同样rules 是AccessRule类,在他的里面也有些有意思且实用的属性和方法。除了上面讲的actions allow roles这些以外,通过AccessRule源码可以知道。还有ips 设置那些ip可以访问

'ips'=>[230,168.*,      //*是通配符11.12.1.182,
],

verbs 指定该规则用于匹配哪种请求方法(例如GET,POST)。 这里的匹配大小写不敏感。

controllers 声明那些控制器受AccessControl限制(还没有用过)指定该规则用于匹配哪些控制器。 它的值应为控制器ID数组。匹配比较是大小写敏感的。如果该选项为空,或者不使用该选项,
则意味着当前规则适用于所有的操作。(译者注:这个选项一般是在控制器的自定义父类中使用才有意义)

matchCallback 指定一个PHP回调函数用于判定该规则是否满足条件。(此处的回调函数是匿名函数)

denyCallback 指定一个PHP回调函数,当这个规则不满足条件时该函数会被调用。(此处的回调函数是匿名函数)很奇怪吧!怎么在rules和access中都有啊!  是的 阅读源码可以看到在AccessControl和AccessRule类中都有denyCallback属性,且定义都是设置为返回一个回调函数给他。那那两者有什么区别呢, 作用域不同,AccessControl中的denyCallback作用域只包括在only中定义的action而AccessRul中denyCallback的作用域只包括在actions中声明的action,各行其道。

yii2授权之ACF相关推荐

  1. yii2 高级版本的权限控制RBAC(认证与授权的使用)修改篇

    common/main.php的components下 'authManager' => ['class' => 'yii\rbac\DbManager','itemTable' => ...

  2. yii2框架_选择Yii 2框架的7个理由

    yii2框架 Late last year, SitePoint published an article highlighting the top PHP frameworks. Tied for ...

  3. ajax后台还没返回就先报error_通用的yii2后台yii2admin

    通用的yii2后台,基于Yii2的advanced应用程序模板,整合RBAC.Menu.Config.Migration多语言.RESTfull等等... 一.开发基础说明 系统配置文件为.env文件 ...

  4. yii2嵌入微信公众号支付

    序言 随着微信被越来越多的人使用,微信商城成为如今的热门.每一个商城都需要有自己的支付方式,微信商城也不例外.微信公众号支付就是微信商城的一种支付方式,微信支付随着微信的推广使用也被广泛应用.今天我主 ...

  5. 从配置文件的角度去了解Yii2

    2019独角兽企业重金招聘Python工程师标准>>> 前言 Yii2是一个奇特的框架,其牺牲了现在盛行的解耦设计,用一个高度耦合的结构提供给开发者一个方便的几类抽象,Applica ...

  6. Yii2.0实现微信公众号后台开发

    2019独角兽企业重金招聘Python工程师标准>>> 研读 微信公众平台开发者文档 ,然后再阅读本文,效果更佳! 接入微信 Yii2后台配置 1.在app/config/param ...

  7. yii2 RESTful api的详细使用

    什么是RESTful风格的API 对于各种客户端设备与服务端的通信,我们往往都通过API为客户端提供数据,提供某种资源.关于RESTful的概念,一查一大推,一两句也解释不清,姑且先按照我们通俗的理解 ...

  8. 【yii2调试神器】yii2-debug能力分析和配置项解析

    2019独角兽企业重金招聘Python工程师标准>>> 我们采用一问一答的方式,先来制定整个专题的情景,本次阿北去一家叫做"千度"的互联网公司应聘yii2工程师, ...

  9. yii2 php反射,Yii2.0-advanced-3—为yii2添加后台模板adminlte和权限组件yii2-adm

    一.yii2-adminlte-asset adminlte一款基于bootstrap的响应模块.yii2-adminlte-asset更是一款基于yii2框架进行开发的后台主题模版. 1.安装(安装 ...

最新文章

  1. 循环:for..in 与for...of 的区别
  2. main 函数内的变量是全局变量,还是局部变量?
  3. Scribefire发CSDN博客
  4. mysql 不在另一张表_mysql查询在一张表不在另外一张表的记录
  5. 体验Microsoft Expression Blend 3 Preview
  6. Windows Server 2003 SP2 RIS 配置问题
  7. js活jQuery实现动态添加、移除css/js文件
  8. 基于tensorflow 1.x 的bert系列预训练模型工具
  9. java迷题_Java——类谜题
  10. python 如果你的年龄大于18_02Python基础
  11. 操作系统——四种进程调度算法模拟实现(C语言)
  12. Nero Burning ROM 11.0.10500附序列号
  13. 那些让我印象深刻的bug--05
  14. BZOJ 1002 1003 1007 被屠记录
  15. python禅语_42:对象、类、以及从属关系
  16. pytest之标记会失败的测试:pytest.mark.xfail
  17. 给定激励,求零输入响应、零状态响应,全响应
  18. 【北亚数据恢复】不认盘的移动硬盘恢复数据案例解决方案
  19. Java实现PDF模板套打(证书)
  20. 专题地图怎么做,怎么打印地图?

热门文章

  1. Google之Stopwatch 计时器
  2. android照片涂抹功能,android:照片涂画功能实现过程及原理详解
  3. 数学式子对应的c语言表达式是,把数学式写成C语言表达式
  4. 戴尔服务器显示器是什么接口,2012 年生产的 Dell Precision 工作站支持多少台显示器以及此类工作站上的显卡接口是什么样子?...
  5. Vue实现一键复制文本内容
  6. Java面试3-5年规划,去了阿里面试软件测试工程师,面试官问我3-5年的职业规划!...
  7. excel转换mysql建表_把 excel 和 mysq l数据库相互转换
  8. 简单实用 微信授权登陆(网页版)
  9. MXS - CSDN 博客开写啦!
  10. mysql 截取第一个字符_MySQL 字符串截取SUBSTRING()函数