我有应用RBAC迁移的yii2高级模板.我正在尝试学习RBAC并遵循Docs 2.0.
我已使用数据库登录,但前端和后端都使用任何帐户登录.我已经做了2个RBAC角色(管理员,用户),但无法理解或找到如何
限制后端登录非管理员用户角色.
以下是角色的代码.和数据库条目:
namespace console\controllers;
use Yii;
use yii\console\Controller;
class RbacController extends Controller
{
public function actionInit()
{
$auth = Yii::$app->authManager;
// add "admin" role
$admin = $auth->createRole('admin');
$auth->add($admin);
// add "user" role
$user = $auth->createRole('user');
$auth->add($user);
$auth->assign($admin, 1);
}
}
Run Code Online (Sandbox Code Playgroud)
用户表:
admin admin@gmail.com 20 10 1421197319 1421197319
user user@gmail.com 10 10 1421198124 1421198124
Run Code Online (Sandbox Code Playgroud)
现行规则:
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index'],
'allow' => true,
'roles' => ['@'],
],
Run Code Online (Sandbox Code Playgroud)
Bsi*_*enn 11
解决了 - 注意:解决方案不完全是RBAC而是ACF.
经过搜索和咨询,我找到了这个yii2 viki的解决方案.
我不清楚RBAC行为,因为我认为它不会让某个角色在某些操作(登录,提交等)之前执行特定任务.
实际上,RBAC会让你做任何尝试,然后检查是否允许,如果不允许则阻止.
例
在一个房子里有一些庭院销售,你可以自由地在它的前院漫游.房门/入口前面没有任何防护装置,也没有锁定.你试图潜入房子,一旦你进入房子,里面有一些保安人员突然阻止你识别自己,他在房屋安全系统中扫描你的信息(数据库中的权限),但找不到你的权利在家里.他强迫你出局.这个警卫是RBAC
我需要一个守卫在前门,除非他们被允许,否则他们不会让任何人进入.这将是ACF.
所以,现在我需要一种方法告诉后端系统特定角色不能事先执行特定操作(即拒绝后端的非管理员登录),这对RBAC是不可能的,因此我们可以使用'matchCallback'使用ACF.
后端规则:
'rules' => [
[
'actions' => ['login'],
'allow' => true,
],
[
'actions' => ['logout', 'index'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return Yii::$app->user->identity->isAdmin;
}
],
]
Run Code Online (Sandbox Code Playgroud)
在matchCallback上真正允许执行的操作和虚假拒绝的动作.isAdmin是一个需要在User模型中定义的getter函数.
namespace /common/models/User;
const ROLE_ADMIN = 20;
public function getIsAdmin()
{
return $this->role == self::ROLE_ADMIN;
}
Run Code Online (Sandbox Code Playgroud)
我在这个yii2 viki的评论中发布了模型的完整工作代码.