授权
授权是指验证用户是否允许做某件事的过程。Yii提供两种授权方法: 存取控制过滤器(ACF)和基于角色的存取控制(RBAC)。
存取控制过滤器
存取控制过滤器(ACF)是一种通过 yii\filters\AccessControl 类来实现的简单授权方法, 非常适用于仅需要简单的存取控制的应用。正如其名称所指,ACF 是一个种行动(action)过滤器 filter,可在控制器或者模块中使用。当一个用户请求一个 action 时, ACF会检查 yii\filters\AccessControl::rules 列表,判断该用户是否允许执 行所请求的action。(译者注: action 在本文中视情况翻译为行动、操作、方法等)
下述代码展示如何在 site 控制器中使用 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'],
'rules' => [
[
'allow' => true,
'actions' => ['login', 'signup'],
'roles' => ['?'],
],
[
'allow' => true,
'actions' => ['logout'],
'roles' => ['@'],
],
],
],
];
}
// ...
}
上面的代码中 ACF 以行为 (behavior) 的形式附加到 site 控制器。 这就是很典型的使用行动过滤器的方法。 only 选项指明 ACF 应当只 对 login, logout 和 signup 方法起作用。所有其它的 site 控制器中的方法不受存取控制的限制。 rules 选项列出了 yii\filters\AccessRule,解读如下:
允许所有访客(还未经认证的用户)执行 login 和 signup 操作。 roles 选项包含的问号 ? 是一个特殊的标识,代表”访客用户”。
允许已认证用户执行 logout 操作。@是另一个特殊标识, 代表”已认证用户”。
ACF 自顶向下逐一检查存取规则,直到找到一个与当前 欲执行的操作相符的规则。 然后该匹配规则中的 allow 选项的值用于判定该用户是否获得授权。如果没有找到匹配的规则, 意味着该用户没有获得授权。(译者注: only 中没有列出的操作,将无条件获得授权)
当 ACF 判定一个用户没有获得执行当前操作的授权时,它的默认处理是:
如果该用户是访客,将调用 yii\web\User::loginRequired() 将用户的浏览器重定向到登录页面。
如果该用户是已认证用户,将抛出一个 yii\web\ForbiddenHttpException 异常。
你可以通过配置 yii\filters\AccessControl::denyCallback 属性定制该行为:
[
'class' => AccessControl::className(),
...
'denyCallback' => function ($rule, $action) {
throw new \Exception('You are not allowed to access this page');
}
]
yii\filters\AccessRule 支持很多的选项。下列是所支持选项的总览。 你可以派生 yii\filters\AccessRule 来创建自定义的存取规则类。
yii\filters\AccessRule::allow: 指定该规则是 "允许" 还是 "拒绝" 。(译者注:true是允许,false是拒绝)
yii\filters\AccessRule::actions:指定该规则用于匹配哪些操作。 它的值应该是操作方法的ID数组。匹配比较是大小写敏感的。如果该选项为空,或者不使用该选项, 意味着当前规则适用于所有的操作。
yii\filters\AccessRule::controllers:指定该规则用于匹配哪些控制器。 它的值应为控制器ID数组。匹配比较是大小写敏感的。如果该选项为空,或者不使用该选项, 则意味着当前规则适用于所有的操作。(译者注:这个选项一般是在控制器的自定义父类中使用才有意义)
yii\filters\AccessRule::roles:指定该规则用于匹配哪些用户角色。 系统自带两个特殊的角色,通过 yii\web\User::isGuest 来判断:
?: 用于匹配访客用户 (未经认证)
@: 用于匹配已认证用户
使用其他角色名时,将触发调用 yii\web\User::can(),这时要求 RBAC 的支持 (在下一节中阐述)。 如果该选项为空或者不使用该选项,意味着该规则适用于所有角色。
yii\filt