Yii Access Controll mit Rollen System


Ein sehr mächtiges Rollensystem für authentifizierteUser bringt Yii von Hause aus mit: CAuthManager.

Damit lassen sich User Rollen abbilden wie z.B.

  1. Redakteure dürfen schreiben und nur Ihre eigenen Posts ändern
  2. Hauptredakteure dürfen alle Posts ändern
  3. Leser dürfen Posts lesen
  4. Admins dürfen alles
  5. unangemeldete User dürfen nichts :)

1. Schritt: Installation

Dokumentation: Role-Based Access Control

config/main.php:

'components' => array(
        'authManager'=>array(
            'class'=>'CDbAuthManager',
            'connectionID'=>'db',
        ),
),

Man kan wählen zwischen Datenbank-basierten oder PHP-Klassen basiertem System, wobei aus performance- und sicherheitstechnischen Gründen auf jeden Fall die Datenbank zu bevorzugen ist , siehe Why CPhpAuthManager can be evil?

Danach müssen die Datenbank-Tabellen und Relationen angelegt werden:

Bsp. MySQL:

/yii/framework/web/auth/schema-mysql.sql

1. Schritt: User Rolen anlegen

class AuthAdminController extends Controller
{
    public function actionIndex()
    {
        //needs to be run once!
        $auth=Yii::app()->authManager;

        $auth->createOperation('writePosts','can write Posts');
        $auth->createOperation('changePosts','can change Posts');
        $auth->createOperation('readPosts','can read Posts');

        $role=$auth->createRole('readPosts');

        $role=$auth->createRole('changePosts');

        $role=$auth->createRole('writePosts');*/

        $role=$auth->createRole('admin');
        $role->addChild('readPosts');
        $role->addChild('changePosts');
        $role->addChild('writePosts');

        $auth->assign('readPosts','2');
        $auth->assign('changePosts','3');
        $auth->assign('writePosts','4');
        $auth->assign('admin','1');

    }
}

Dieses Script muss nur einmal ausgeführt werden und ordnet den schon vorhanden Usern in der Datenbank (in der Tabelle users) eine Rolle zu und befüllt die Tabellen

  • authassignment
  • authitem
  • authitemchild

mit Inhalten aus dem Script.

3.Schritt: verwenden der Rollen in den Controllern

    public function accessRules()
    {
        return array(
            array('allow', 
                'roles' => array('readPosts')

            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),
        );
    }

Diesen Controller kann jetzt nur der User mit der ID 2 und 4 aufrufen (‘readPosts’ und ‘admin’), alle anderen kriegen eine White Screen und einen “NetworkError: 403 Forbidden” zu sehen.