Yii2 访问控制过滤器
Yii2 提供了两种授权访问方式:Access Control Filter(ACF) 和 Role-Based Access Control(RBAC,基于角色的访问授权)。
下面对 ACF 作个简单的记录。
例如在默认的 SiteController 有个 behaviors 方法,里面定义了多条 rules ,ACF 会逐条检查,直到匹配。
use yii\web\Controller;
use yii\filters\AccessControl;
class SiteController extends Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['login', 'logout', 'signup'], // 指 ACF 只应用到以下 actions 中
'rules' => [
[
'allow' => true,
'actions' => ['login', 'signup'],
'roles' => ['?'], // ?指规则适用于游客
],
[
'allow' => true,
'actions' => ['logout'],
'roles' => ['@'], // @指规则适用于已认证的用户
],
],
],
];
}
// ...
}
上面是官方文档的例子,一般来说 rules 还有其他选项可以设置。
allow 指定规则是 allow 还是 deny。
actions 指定规则适用于哪几个 actions。这应该是一个 action IDs 数组。区分大小写。如果为空或者没有设置的话,指应用到所有 actions。
controllers 基本与 actions 类似。
roles 指定规则适用于哪些用户角色,有两个用户角色可用作识别,可通过 yii\web\User::$isGuest 来检查。? 指游客 (未认证);@ 指已认证的用户。如果为空或者没有设置的话,则匹配所有用户。
ips 指定规则匹配哪些客户端 ip,ip 地址可以使用通配符 ,例如:192.168.。为空或者没有设置的话,则匹配所有。
berbs 指定规则匹配哪些请求方式 (例如:GET,POST),区分大小写。
matchCallback 当确定应用该规则时调用。
denyCallback 当这条规则禁止访问时调用。
下面是使用 matchCallback 和 denyCallback 的一个例子
use yii\filters\AccessControl;
class SiteController extends Controller
{
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['special-callback'],
'rules' => [
[
'actions' => ['special-callback'],
'allow' => true,
'matchCallback' => function ($rule, $action) {
return date('d-m') === '31-10';
},
'denyCallback' => function ($rule, $action) {
throw new \Exception('You are not allowed to access this page');
}
],
],
],
];
}
// Match callback called! This page can be accessed only each October 31st
public function actionSpecialCallback()
{
return $this->render('happy-halloween');
}
}
除此之外,Yii2 还有 RBAC(基于角色的访问授权),需要多去了解 :)