Tutorial Yii Users e Rights
Ok avete un installazione pulita di Yii…ed ora? Spesso il secondo passo da fare prevede l’aggiunta del supporto per gli utenti ed uno schema per i permessi. La guida ufficiale sull’autenticazione e sulle autorizzazioni di Yii spiega in dettaglio come Yii gestisce questi aspetti. Ma se volete potete installare queste due estensioni “Yii Users” e “Rights”, che lavorano bene assieme per ottenere lo stesso risultato…
Per prima cosa installiamo Yii User:
- Per prima cosa scarichiamo Yii User e scompattiamo il contenuto sotto la cartella /webapp/protected/modules/user (la versione che ho usato io è la 0.3-r107)
- Modificate il file di config di Yii sotto config/main.php
return array( #... // autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', 'application.modules.user.models.*', 'application.modules.user.components.*', ), #... 'modules'=>array( 'user', ), #... // application components 'components'=>array( #... 'user'=>array( // enable cookie-based authentication 'allowAutoLogin'=>true, 'loginUrl' => array('/user/login'), ), #... ), #... ); - Create le tabelle in MySql partendo dal file schema.mysql.sql sotto protected/modules/user/data, se invece usate sqlite usate il file schema.sqlite.sql.
- Aggiungete nella sezione db sotto components del file di config di Yii sotto config/main.php la sezione ‘tablePrefix’ => ‘tbl_’ altrimenti il modulo non vedrà le tabelle appena create con suffisso tbl_
'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=testyiiuser', 'emulatePrepare' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'tablePrefix' => 'tbl_' ),
- Modificate il file sotto protected/views/layouts/main.php nella sezione di zii.widgets
<!--?php $this--->widget('zii.widgets.CMenu',array( 'items'=>array( array('label'=>'Home', 'url'=>array('/site/index')), array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')), array('label'=>'Contact', 'url'=>array('/site/contact')), /*array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest), array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)*/ array('url'=>Yii::app()->getModule('user')->loginUrl, 'label'=>Yii::app()->getModule('user')->t("Login"), 'visible'=>Yii::app()->user->isGuest), array('url'=>Yii::app()->getModule('user')->registrationUrl, 'label'=>Yii::app()->getModule('user')->t("Register"), 'visible'=>Yii::app()->user->isGuest), array('url'=>Yii::app()->getModule('user')->profileUrl, 'label'=>Yii::app()->getModule('user')->t("Profile"), 'visible'=>!Yii::app()->user->isGuest), array('url'=>Yii::app()->getModule('user')->logoutUrl, 'label'=>Yii::app()->getModule('user')->t("Logout").' ('.Yii::app()->user->name.')', 'visible'=>!Yii::app()->user->isGuest), ), )); ?> - Ora potrete loggarvi con gli utenti di default creati dallo script:
- admin/admin
- demo/demo

Login dell'utente admin

Gestione Utenti Yii Users
- Scarichiamo il modulo Rights (la versione che ho usato io è la 1.3.0.r147)
- Scompattiamo il contenuto sotto /webapp/protected/modules/rights
- Modifichiamo il file di config sotto /webapp/protected/config/main.php nella sezione import
// autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', 'application.modules.user.models.*', 'application.modules.user.components.*', 'application.modules.rights.*', 'application.modules.rights.components.*', ), - Modifichiamo sempre nel config la sezione modules per abilitare l’installazione di rights, a fine installazione ricordatevi di commentare od impostare a false la sezione appena aggiunta
'modules'=>array( // uncomment the following to enable the Gii tool /* 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'Enter Your Password Here', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ), */ 'user', 'rights'=>array( 'install'=>true, ), ), - Sempre nel config sotto la sezione components aggiungete
'authManager'=>array( 'class'=>'RDbAuthManager', 'connectionID'=>'db', 'defaultRoles'=>array('Authenticated', 'Guest'), ), - A questo punto lanciate lo script di installazione di rights http://localhost/nomeapplicazione/rights e seguite le istruzioni
- Ora rimuovete dal config la sezione di install di rights
'rights'=>array( 'install'=>false, // Disabilita l'installer. ), - Modificate il menu Cmenu sotto /webapp/protected/views/layouts/main.php per aggiungere un link alla pagina di gestione di rights
array('label'=>'Rights', 'url'=>array('/rights')),
Ora nell’applicazione potrete gestire i permessi dal pannello di rights:

Pannello gestione yii rights
Per eventuali confronti riporto il mio file main.php completo:
<?php
// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Web Application',
// preloading 'log' component
'preload'=>array('log'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
'application.modules.user.models.*',
'application.modules.user.components.*',
'application.modules.rights.*',
'application.modules.rights.components.*',
),
'modules'=>array(
// uncomment the following to enable the Gii tool
/*
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),
*/
'user',
'rights'=>array(
'install'=>false,
),
),
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
'loginUrl' => array('/user/login'),
'class'=>'RWebUser',
),
'authManager'=>array(
'class'=>'RDbAuthManager',
'connectionID'=>'db',
'defaultRoles'=>array('Authenticated', 'Guest'),
),
// uncomment the following to enable URLs in path-format
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
/*
'db'=>array(
'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
),
*/
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=testyiiuser',
'emulatePrepare' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'tablePrefix' => 'tbl_'
),
'errorHandler'=>array(
// use 'site/error' action to display errors
'errorAction'=>'site/error',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
// uncomment the following to show log messages on web pages
/*
array(
'class'=>'CWebLogRoute',
),
*/
),
),
),
// application-level parameters that can be accessed
// using Yii::app()->params['paramName']
'params'=>array(
// this is used in contact page
'adminEmail'=>'webmaster@example.com',
),
);
Per favore fatemi sapere di eventuali correzioni o suggerimenti.
Fonti:
http://www.benjaminlhaas.com/blog/installing-yii-users-and-rights-5-steps
http://www.yiiframework.com/extension/rights/
http://code.google.com/p/yii-user/wiki/Installation
una volta installato tutto, come si fa ad usare rights?
Ad esempio se volessi inibire l’accesso a tutto un controller da parte di un utente di tipo Guest, creo l’item per le azioni del controller e poi?
Prova a leggere la guida di rights e questo post sulla gestione dei permessi e dei ruoli
Ciao,
bel tutorial, grazie mille. Lo sto usando insieme ad altre risorse per mettere le basi di un applicazione.
Per completezza, alla fine dell’installazione di yii-user ho provato e andava tutto tranne che per una fastidiosa Exception al momento del login:
CWebUser and its behaviors do not have a method or closure named “updateSession”
Si risolve aggiungendo a /config/main.php, nella sezione ‘components’, la riga per utilizzare la classe utente necessaria:
‘components’=>array(
‘user’=>array(
‘class’=>’WebUser’, // use WebUser class for app users
…
…),
),
Nonostante l’erroe, il login viene effettuato e probabilmente se si completa il tutorial senza fermarsi a provare, non ce ne si accorge nemmeno (in seguito viene aggiunta la classe utente ‘RWebUser’), ma per chi magari sia più… ehm, pignolo può servire (anche a capire).
Comunque gran tutorial, grazie mille!
rash*
Ciao di nuovo,
un’altra nota.
Anche dopo aver finito di installare yii-rights (seguendo il tuo tutorial), facendo il login si riceve un messaggio simile al precedente:
RWebUser and its behaviors do not have a method or closure named “updateSession”
Anche in questo caso, come nel precedente, se si ricarica la pagina, il login è stato eseguito, nonostante l’errore precedente.
Questo problema si risolve facendo sì che la classe RWebUser estenda WebUser (mentre di default estende CWebUser). E’ dunque necessario modificare il file rights/components/RWebUser.php.
Una volta fatto, tutto funziona perfettamente.
Per completezza, le versioni utilizzate sono:
- yii 1.1.12
- yii-user 0.3 74-ga77afe8
- yii-rights 1.3.0 r147
Grazie ancora,
rash*