Yii2框架ACF(AccessControl Filter)的使用
2017-03-14 10:46
288 查看
AccessControl其实也就是 yii\filters\AccessControl Filter, 我们下面简写为 ACF 作为描述。
ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控制器的action。对于一些复杂的验证方式,我们后面会说到 Role Based Access Control (rbac),即基于角色的权限控制。
接下来我们就上面抛出的问题进行解析。
有同学要质疑了,创建新用户的操作,肯定要后台管理才可以进行操作,包括列表页等一系列操作,没登录肯定不能访问啊啊啊。
不急,下面我们就看看如何通过ACF去对 user-backend/* 的系列操作进行授权限制!
打开backend\controller\SiteController.php 我们看到这样一段代码
我们发现AccessControl是以行为behaviors的方式附加在当前控制器。
不妨打开yii\filters\AccessControl.php文件,init方法中我们看到 配置项rules在使用之前,都会被创建为 yii\filters\AccessRule 的对象。
也就是说我们实际的配置应该是这样的
通过配置一文,很容易就猜到 这里的actions和allow就是 AccessRule的属性了。
接着我们看到实际的请求过滤是在beforeAction中进行的!也就是说,在beforeAction中加了一层过滤的条件规则!
如此一来,整个过滤的流程你是不是感觉到清晰了好多,但是还没有完,我们还没有说具体的过滤规则,从init方法中,我们了解到具体的规则即是 yii\filters\AccessRule 类的属性了。也就是说,规则怎么写,就要看你怎么设定accessRule的属性了!属性怎么设置?打开 yii\filters\AccessRule文件,看每一个具体的注解!这里就不说了,因为注解已经写得非常详细了,说多了自然就累赘,不好不好。
那接下来我们就解决问题,UserBackendController/* 所有的操作应该都设置为登录之后才可以操作
我们再做几个小练习
1、假设index操作只允许post请求才可以访问
我们新增加的一条规则,设置了AccessRule::verbs属性即可。
注意哦,ACF 自上向下逐一检查规则,直到匹配到一个规则。也就是说如果你这里把verbs的actions index也添加一份到上面的那一条规则,verbs这条规则就相当于废掉了!
2、假设更新操作update只有用户test1可以访问,其他用户不可以访问
我们现在只有一个用户test1, 为了实现命题,在添加一个新用户test2
ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控制器的action。对于一些复杂的验证方式,我们后面会说到 Role Based Access Control (rbac),即基于角色的权限控制。
接下来我们就上面抛出的问题进行解析。
有同学要质疑了,创建新用户的操作,肯定要后台管理才可以进行操作,包括列表页等一系列操作,没登录肯定不能访问啊啊啊。
不急,下面我们就看看如何通过ACF去对 user-backend/* 的系列操作进行授权限制!
打开backend\controller\SiteController.php 我们看到这样一段代码
public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ 'actions' => ['login', 'error'], 'allow' => true, ], [ 'actions' => ['logout', 'index'], 'allow' => true, 'roles' => ['@'], ], ], ], 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'logout' => ['post'], ], ], ]; }
我们发现AccessControl是以行为behaviors的方式附加在当前控制器。
不妨打开yii\filters\AccessControl.php文件,init方法中我们看到 配置项rules在使用之前,都会被创建为 yii\filters\AccessRule 的对象。
也就是说我们实际的配置应该是这样的
'rules' => [ [ 'class' => 'yii\filters\AccessRule', 'actions' => ['login', 'error'], 'allow' => true, ], ],
通过配置一文,很容易就猜到 这里的actions和allow就是 AccessRule的属性了。
接着我们看到实际的请求过滤是在beforeAction中进行的!也就是说,在beforeAction中加了一层过滤的条件规则!
如此一来,整个过滤的流程你是不是感觉到清晰了好多,但是还没有完,我们还没有说具体的过滤规则,从init方法中,我们了解到具体的规则即是 yii\filters\AccessRule 类的属性了。也就是说,规则怎么写,就要看你怎么设定accessRule的属性了!属性怎么设置?打开 yii\filters\AccessRule文件,看每一个具体的注解!这里就不说了,因为注解已经写得非常详细了,说多了自然就累赘,不好不好。
那接下来我们就解决问题,UserBackendController/* 所有的操作应该都设置为登录之后才可以操作
'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ // 当前rule将会针对这里设置的actions起作用,如果actions不设置,默认就是当前控制器的所有操作 'actions' => ['index', 'view', 'create', 'update', 'delete', 'signup'], // 设置actions的操作是允许访问还是拒绝访问 'allow' => true, // @ 当前规则针对认证过的用户; ? 所有方可均可访问 'roles' => ['@'], ], ], ],
我们再做几个小练习
1、假设index操作只允许post请求才可以访问
'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ // 当前rule将会针对这里设置的actions起作用,如果actions不设置,默认就是当前控制器的所有操作 'actions' => ['view', 'create', 'update', 'delete', 'signup'], // 设置actions的操作是允许访问还是拒绝访问 'allow' => true, // @ 当前规则针对认证过的用户; ? 所有方可均可访问 'roles' => ['@'], ], [ 'actions' => ['index'], 'allow' => true, // 设置只允许操作的action 'verbs' => ['POST'], ], ], ],
我们新增加的一条规则,设置了AccessRule::verbs属性即可。
注意哦,ACF 自上向下逐一检查规则,直到匹配到一个规则。也就是说如果你这里把verbs的actions index也添加一份到上面的那一条规则,verbs这条规则就相当于废掉了!
2、假设更新操作update只有用户test1可以访问,其他用户不可以访问
我们现在只有一个用户test1, 为了实现命题,在添加一个新用户test2
'access' => [ 'class' => AccessControl::className(), 'rules' => [ [ // 当前rule将会针对这里设置的actions起作用,如果actions不设置,默认就是当前控制器的所有操作 'actions' => ['index', 'view', 'create', 'delete', 'signup'], // 设置actions的操作是允许访问还是拒绝访问 'allow' => true, // @ 当前规则针对认证过的用户; ? 所有用户均可访问 'roles' => ['@'], ], [ 'actions' => ['update'], // 自定义一个规则,返回true表示满足该规则,可以访问,false表示不满足规则,也就不可以访问actions里面的操作啦 'matchCallback' => function ($rule, $action) { return Yii::$app->user->id == 1 ? true : false; }, 'allow' => true, ], ], ],
相关文章推荐
- Yii2框架使用redis(一): Linux下redis的安装和开启
- yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
- yii2框架中使用嵌套集合实现无限极商品分类
- Yii2如何使用存取控制过滤器(ACF)
- Yii2框架中使用PHPExcel导出Excel文件的示例
- yii2框架中使用下拉菜单的自动搜索yii-widget-select2
- 使用yii2框架中用gii生成crud的views找不到生成文件
- Yii2框架中日志的使用方法分析
- 在yii2框架中使用redis
- 使用YII2框架尝试微信公众号中表单的提交
- yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
- YII2框架中不用composer而是手动使用插件配置方法
- [YII2] 自定义组件,在YII框架中正常使用
- Sitemesh 3 的使用及配置 1 . Sitemesh 3 简介 Sitemesh 是一个网页布局和修饰的框架,基于 Servlet 中的 Filter,类似于 ASP.NET 中的‘母版页’
- yii2 高级框架无法使用yii命令的问题
- Yii2框架使用redis(二): yii2本地添加redis扩展及其使用
- Yii2如何使用存取控制过滤器(ACF)
- yii2框架中使用sphinx使用搜索引擎 多条件选择搜索
- 在Yii2框架中使用netstedsets与ztree实现无限极分类管理教程
- 使用YII2框架实现微信公众号中表单提交功能