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.
