Ein sehr mächtiges Rollensystem für authentifizierteUser bringt Yii von Hause aus mit: CAuthManager.
Damit lassen sich User Rollen abbilden wie z.B.
- Redakteure dürfen schreiben und nur Ihre eigenen Posts ändern
- Hauptredakteure dürfen alle Posts ändern
- Leser dürfen Posts lesen
- Admins dürfen alles
- 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.