ACF:存取控制过滤器
存取控制过滤器(ACF)是一种通过 yiifiltersAccessControl 类来实现的简单授权方法。
介绍其使用:
public function behaviors()
{
return [
'access' => [
'class' => yii\filters\AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['create', 'update', 'view', 'delete'],
'roles' => ['@'],
],
[
'allow' => true,
'actions' => ['index'],
'roles' => ['?'],
],
],
],
];
}
- rules:array a list of access rule objects or configuration arrays for creating the rule objects.
- If a rule is specified via a configuration array, it will be merged with [[ruleConfig]] first
- before it is used for creating the rule object.
- 允许所有访客(还未经认证的用户)执行 index 操作。 roles 选项包含的问号 ? 是一个特殊的标识,代表”访客用户”。
- 允许已认证用户执行 create update view delete操作。@是另一个特殊标识, 代表”已认证用户”。
基于角色的存取控制 (RBAC)
只简单介绍使用数据库存放授权数据
在配置文件web.php中添加component配置:
'components' => [
......
'authManager' => [
'class' => 'yii\rbac\DbManager',
'itemTable' => 'auth_item',
'assignmentTable' => 'auth_assignment',
'itemChildTable' => 'auth_item_child',
],
]
DbManager 使用4个数据库表存放它的数据:
yiirbacDbManager::$itemTable: 该表存放授权条目(译者注:即角色和权限)。默认表名为 “auth_item” 。
yiirbacDbManager::$itemChildTable: 该表存放授权条目的层次关系。默认表名为 “auth_item_child”。
yiirbacDbManager::$assignmentTable: 该表存放授权条目对用户的指派情况。默认表名为 “auth_assignment”。
yiirbacDbManager::$ruleTable: 该表存放规则。默认表名为 “auth_rule”。
你需要在数据库中创建这些表。你可以使用存放在 @yii/rbac/migrations 目录中的数据库迁移文件来做这件事。
授权步骤如下:
定义角色和权限
建立角色和权限的关系
定义规则
将规则与角色和权限作关联
指派角色给用户
具体实现如下代码:
public function actionAccess()
{
$auth = Yii::$app->authManager;
//创建agent权限
$agentPermission = $auth->createPermission('agent');
$agentPermission->description = 'create agent operate permission.';
$auth->add($agentPermission);
//创建admin角色
$adminRole = $auth->createRole('admin');
$adminRole->description = 'create admin role.';
$auth->add($adminRole);
//将权限赋予角色
$auth->addChild($adminRole, $agentPermission);
//将角色赋予用户
$userId = 1;
$auth->assign($adminRole, $userId);
}
授权结束后就可以进行控制器请求执行前的权限判断了。如下:
public function beforeAction($action)
{
if (!parent::beforeAction($action)) {
return false;
}
if (Yii::$app->user->can(Yii::$app->controller->id)) {
return true;
}
throw new \yii\web\UnauthorizedHttpException('无权查看');
}
Yii::$app->user->can($permissionName)
传入权限的名称,yii会自动去判断当前用户是否具有这种权限,返回true或false。
如果为true就可以继续执行请求的方法了。
如果为false,我们可以做一些拦截,比如直接抛出异常。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。