ACF:存取控制过滤器
存取控制过滤器(ACF)是一种通过 yii\filters\AccessControl 类来实现的简单授权方法。
介绍其使用:
public function behaviors()
{
return [
'access' => [
'class' => yii\filters\AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['create', 'update', 'view', 'delete'],
'roles' => ['@'],
],
[
'allow' => true,
'actions' => ['index'],
'roles' => ['?'],
],
],
],
];
}
基于角色的存取控制 (RBAC)
只简单介绍使用数据库存放授权数据
在配置文件web.php中添加component配置:
'components' => [
......
'authManager' => [
'class' => 'yii\rbac\DbManager',
'itemTable' => 'auth_item',
'assignmentTable' => 'auth_assignment',
'itemChildTable' => 'auth_item_child',
],
]
DbManager 使用4个数据库表存放它的数据:
yii\rbac\DbManager::$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,我们可以做一些拦截,比如直接抛出异常。
参考:Yii2.0授权指南
http://www.yiichina.com/doc/guide/2.0/security-authorization