yii2拒绝用户在后端登录

Bsi*_*enn 5 php rbac yii2

我有应用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的评论中发布了模型的完整工作代码.