Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Doubts about Yii2 RBAC

Tags:

php

yii2

rbac

I've been developing web apps using Yii 1.1.14 so far, but now it's time for an upgrade.

The company where I work has developed its own Access Control system, and I was really OK with it until I saw what it was really like... A combination of 8 tables in the database (not counting the users table), with a bunch of foreign keys.

  • 1 table for controllers
  • 1 table for the actions
  • 1 table for the menu categories
  • 1 table for types of users
  • And the other tables basically just connect 2 or 3 of those tables at a time.

It works well, but in my point of view it's highly time consuming to maintain all those tables, and at some point, when your application goes online, if it hits a certain amount of users it could get really slow. specially because 2 of those tables have the user's table primary key as foreign key.

So I've decided that, when I start developing on Yii 2, I'm going to start using RBAC, so I started looking for tutorials online... Only finding many different versions of the same code with author's role, and permissions for create or update posts.

I found a combination of 5 videos on Youtube, but they are about Yii 1 RBAC. They were helpful because I managed to understand most of RBAC's functionality, but I still have some doubts that I'll enumerate below. And keep in mind that for this Access Control system I'm using the DBManager class.

My Doubts

  1. Yii 1's RBAC used to have 3 tables: auth_assignment, auth_item and auth_item_child. Now in Yii 2 RBAC, a new table appears that is called auth_rule and I still don't understand what that specific table is doing there, how to use it or how to populate it.

  2. I see that it's possible to restrict the user's access to some actions by using the controller's behavior method, and assigning access to some actions depending on the user's role, but when it comes to this I have to split my question into 2:

    2.1. First: If you can just restrict the access to actions by setting it up in the behaviors method, then what's the use of saving permissions to the auth_item table?

    2.2. Second: If you DO decide to control access according to permissions, then how exactly do you do it, because I find myself writing the following type of code inside of every function and I don't think using RBAC is supposed to be this tedious. There has to be another way.

    public function actionView($id)
    {
        if(Yii::$app->user->can('view-users')){
            return $this->render('view', [
                'model' => $this->findModel($id),
            ]);
        }else{
            #Redirect to a custom made action that will show a view 
            #with a custom error message
            $this->redirect(['//site/notauthorized']);
        }
    }
    
  3. Because of the Access Control System that we use right now, when a user logs in, a complex query is executed that will end up returning an array that will be saved as a session variable, and will be used to create a menu with as many dropdownlists as menu categories, that the controllers that the user has access to belong to. How can this be done with RBAC?

like image 891
arrigonfr Avatar asked Nov 05 '14 08:11

arrigonfr


2 Answers

I can only really answer 2.2 of your question, as 3 doesn't sound at all like something an RBAC should do. You could, however, get the information you needed from the rules table most likely, provided you followed a naming convention that matched your controllers or actions.

On to answering 2.2 though:

You can simply set the behavior like such:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'allow' => true,
                    'actions' => ['view'],
                    'roles' => ['view-users'], //<-- Note, rule instead of role
                ],
        ]
    ]
}

This doesn't solve a different problem of 'view-own-users' style permissions, as this needs to inspect the ActiveRecord model (well, at least it does in my application). If You want to achieve this, take a look at my post in the Yii forums here:

http://www.yiiframework.com/forum/index.php/topic/60439-yii2-rbac-permissions-in-controller-behaviors/#entry269913

like image 175
Joel Small Avatar answered Oct 08 '22 00:10

Joel Small


I use it in one of the simplest method,I use them in the behaviours of my controller.

 public function behaviors()
    {

        return [
            'access' => [
                'class' => \yii\filters\AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['sysadmin'],
                        'actions' => ['index','view','update'],
                    ],
                    [
                        'allow' => true,
                        'roles' => ['staff'],
                        'actions' => ['index','create','update','view'],
                    ],
                ],
            ],
        ];

    }

Here roles are the one created in the auth-item table in the database and they have been assigned for users in auth-assignment table. In the behaviours we just use it as above. In the above code sysadmin can have access to index, view and update action, whereas staff can have access to index,create, update and view action.

like image 20
Mohan Prasad Avatar answered Oct 08 '22 00:10

Mohan Prasad