编程学习网 > PHP技术 > Yii2 > Yii2中常用的behavior类的使用讲解
2019
11-29

Yii2中常用的behavior类的使用讲解

常用类1:AccessControl
public function behaviors() {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'denyCallback' => function ($rule, $action) {
                    throw new \Exception('您无权访问该页面');
                },
                'rules' => [
                    [
                        'actions' => ['index', 'list'],
                        'allow' => true,
                        'roles' => ['?'],
                    ],
                    [
                        'actions' => ['index', 'list'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ]
        ];
    }

访问控制过滤器(Access Control Filter,简称 ACF)是一种简单的授权验证方法, 最适用于那些只需要一些基本访问控制的应用。正如其名,ACF 是一个动作过滤器, 可以定义为一个 行为(Behavior)被附加到一个控制器或者模块上。 ACF 会检查一系列的 [[yii\filters\AccessControl::rules|access rules]],来确认当前用户是否有权限访问当前被请求的动作。
在上面的代码中,ACF 被定义为一个行为,并附加到了 site 控制器上。这是一种典型的使用动作过滤器的方法。
only 选项指定了当前 ACF 只应被应用在 login、logout 和 signup 这三个动作上。 rules选项指定了 [[yii\filters\AccessRule|access rules]](访问规则),可以解读成以下自然语言:
允许所有游客(未登陆的用户)访问 'login'(登陆)和 'signup'(注册)两个动作。
roles 选项包含一个问号 ? ,问号是一个代指“游客”的指示符。
允许所有已登录用户访问 'logout'(登出)动作。@ 符号是另外一个特殊指示符,他的意思是所有已登录用户。
这是官方给出的文档说明:
[[yii\filters\AccessRule|Access rules]] 支持很多选项。以下是受支持选项的总结。 你也可以扩展 [[yii\filters\AccessRule]] 类来创建一个您自定义的访问控制规则类。

[[yii\filters\AccessRule::allow|allow]]:指定了这是一个“准许”还是“拒绝”访问的规则。
[[yii\filters\AccessRule::actions|actions]]:指定了哪些动作受该规则影响。对应值应该是一个存储这些动作 ID 的数组。 这种比对是大小写敏感的。如果该选项为空或未设置,则意味着规则适用于全体动作。(译者注:也就是不过滤或全过滤,取决于 allow 的值)
[[yii\filters\AccessRule::controllers|controllers]]:指定哪些控制器受此规则影响。对应值应该是存储控制器 ID 的数组。 同样比对是大小写敏感的。若为空或未设置则应用于全体控制器。
[[yii\filters\AccessRule::roles|roles]]:指定了该规则适用于哪些用户组(角色)。 有两种通过 [[yii\web\User::isGuest]] 检查的特殊用户组标识符:
?:对应游客用户(还未登录验证的用户)
@:对应已登录用户 使用其他用户角色(组)需要 RBAC 的支持(会在下个板块详述),且会调用 [[yii\web\User::can()]] 方法。 若该选项为空或未设置,则意味着该选项应用于所有用户角色(组)。
[[yii\filters\AccessRule::ips|ips]]:指定该规则匹配哪些 [[yii\web\Request::userIP|client IP addresses]] (客户端 IP 地址) 一个 IP地址可以在结尾处包含一个通配符 * ,这样它可以匹配所有有相同前缀的 IP 地址。 比如说,'192.168.*' 匹配所有前缀为 '192.168.' 的 IP 地址。 若该选项为空或未设置,则该规则匹配所有 IP 地址。
[[yii\filters\AccessRule::verbs|verbs]]:指定该规则匹配哪些 request 请求方法(GET、POST 之类的) 同样比对是大小写敏感的。
[[yii\filters\AccessRule::matchCallback|matchCallback]]:指定当规则符合时调用哪个 PHP callable 对象 (可调用接口的对象,也就是函数对象,各种各样的函数对象)。
[[yii\filters\AccessRule::denyCallback|denyCallback]]: 指定当规则需要拒绝相关访问时,应该调用哪个 PHP callable 对象。
 

参考文献:http://www.yiifans.com/yii2/guide/security-authorization.html
常用类2:VerbFilter
use yii\filters\VerbFilter;
public function behaviors()
{
    return [
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'index'  => ['get'],
                'view'   => ['get'],
                'create' => ['get', 'post'],
                'update' => ['get', 'put', 'post'],
                'delete' => ['post', 'delete'],
            ],
        ],
    ];
}

综合使用方法是:
public function behaviors() {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'denyCallback' => function ($rule, $action) {
                    throw new \Exception('您无权访问该页面');
                },
                'rules' => [
                    [
                        'actions' => ['index', 'list'],
                        'allow' => true,
                        'roles' => ['?'],
                    ],
                    [
                        'actions' => ['index', 'list'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'index' => ['get'],//只允许get方式访问
                    'list' => ['get', 'post'],
                    'delete' => ['post'],//只允许post方式访问
                ],
            ],
        ];
    }

此类用于检测HTTP请求的方式(get,post等)是否被允许在被请求的action上面执行。如果不被允许,则会抛出一个http的405错误。
这两个类基本上囊括了常用的大部分行为类的使用。了解并掌握好它们对学习好yii框架有很大的益处。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取