[Risolto] Yii Rights Module Tutorial

Questa guida è per favorire i principianti nell’installazione del modulo rights per la gestione dell’autenticazione di yii.

Finora tra tutti i moduli che ho visto, mi sembra uno di quelli fatti meglio.

Prima avevo provato srbac ma direi che non c’è proprio confronto

e quindi ne consiglio sicuramente la sua installazione.

La guida in inglese che meglio mi ha aiutato è stata questa qui:

http://yii-rights.go…s-doc-1.2.0.pdf

  1. Per prima cosa bisogna creare la tabella per la gestione delle utenze



CREATE TABLE `user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(128) COLLATE utf8_bin NOT NULL,

  `password` varchar(128) COLLATE utf8_bin NOT NULL,

  `remember` tinyint(1) DEFAULT NULL,

  `email` varchar(128) COLLATE utf8_bin NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4 ;


INSERT INTO `user` VALUES(1, 'khurram', 'password', NULL, 'khurram_619@msn.com');

INSERT INTO `user` VALUES(2, 'demo', 'demo', NULL, 'demo@demo.it');



  1. poi tramite gii, creare la classe User associata alla tabella del db

  2. scaricare il modulo rigths da qui:

http://code.google.c.../downloads/list

  1. scompattare il tutto nella cartella modules (che potrebbe essere da creare)

in modo che venga fuori così protected\modules\rights

  1. modificare la configurazione dell’applicazione /protected/config/main.php così:




'import'=>array(

 ...... 

'application.modules.rights.*', 

'application.modules.rights.components.*', // Correct paths if necessary. 

),

 ......

 'components'=>array(

 ......

 'user'=>array(

 'class'=>'RWebUser', // Allows super users access implicitly.

 ......

 ),

 'authManager'=>array(

 'class'=>'RDbAuthManager', // Provides support authorization item sorting.

 ......

 ),

 ......

 ),

 'modules'=>array(

 'rights'=>array(

 'install'=>true, // Enables the installer.

 ),),



Per eventuali confronti riporto la mia unit main.php completa:





<?php

error_reporting(E_ALL ^ E_NOTICE);

// 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'=>'Esperimenti del Janka',


	'language'=>'it',//W l'Italia 

    'sourceLanguage'=>'it_IT',//W l'italiano	

	// preloading 'log' component

	'preload'=>array('log'),


	// autoloading model and component classes

	'import'=>array(

		'application.models.*',

		'application.components.*',


		//Per usare il modulo RIGHTS 

		'application.modules.rights.*',  // Le paths contenenti rights

		'application.modules.rights.components.*', //I:\prova\demo\protected\modules\rights

		//Vedi anche la guida 

		//http://yii-rights.googlecode.com/files/yii-rights-doc-1.2.0.pdf

	),


	'modules'=>array(

		// togliere il commento sulla seguente riga per abilitare i Gii tool

		//Una volta abilitato, puoi accedere ai gii tool da questo url:

		//http://localhost/prova/demo/index.php/gii/

		//Se non lo abiliti in questo modo:

		//http://localhost/prova/demo/index.php?r=gii

		//Se non sai come si usa questo tool, guarda questi video:

		//http://www.yiiframework.com/screencasts/		

		'gii'=>array(

			'class'=>'system.gii.GiiModule',

			'password'=>'pino',

 			// If removed, Gii defaults to localhost only. Edit carefully to taste.

			// 'ipFilters'=>array('127.0.0.1','::1'),

			//Imposto che possano accedere solo le macchine della rete 10.1.0.*

			'ipFilters'=>array('10.1.0.*','::1'),

		),


/*

* Inizio gestione del modulo rights per la gestione dell'autenticazione

* per i dettagli leggere la guida in inglese:

* http://yii-rights.googlecode.com/files/yii-rights-doc-1.2.0.pdf

* per usare questo modulo

* ho hanche ritoccato le sezioni "import" e aggiunto

* authManager e user in components

*/


		//Voglio usare il modulo rigths

		'rights'=>array(

			'install'=>true, // Abilita l'installer.

//Quelli che seguono sono i parametri di default, potrei anche saltarli

/*

			'userIdColumn'=>'id', // Il nome della colonna user id nel database. 

			'userNameColumn'=>'username', // Il nome della colonna name nel database. 

			'superuserName'=>'Admin', // Name of the role with super user privileges. 

			'authenticatedName'=>'Authenticated', // Name of the authenticated user role. 

			'enableBizRule'=>true, // Whether to enable authorization item business rules. 

			'enableBizRuleData'=>false, // Per abilitare data for business rules. 

			'displayDescription'=>true, // Per usare la descrizione dell'oggetto al posto del nome. 

			'flashSuccessKey'=>'RightsSuccess', // Key to use for setting success flash messages. 

			'flashErrorKey'=>'RightsError', // Key to use for setting error flash messages. 

			'baseUrl'=>'/rights', // Base URL for Rights. Change if module is nested. 

			'layout'=>'rights.views.layouts.main', // Layout to use for displaying Rights. 

			'appLayout'=>'application.views.layouts.main', // Application layout. 

			'cssFile'=>'rights.css', // Style sheet file to use for Rights. 

			'debug'=>false, // Per abilitare la modalità di debug.

*/

		),		

/*

* Fine gestione modulo rights

*/


	),


	// application components

	'components'=>array(

		'user'=>array(

			'class' => 'RWebUser',  // Consento l'accesso implicitamente ai super users.			

			'allowAutoLogin'=>true, // abilito l' autenticazione basata su cookie 

		),

		

		//dico a Yii che voglio gestire l'autenticazione utenti tramite db

		'authManager'=>array(

            'class'=>'RDbAuthManager',

		),


		

		

		

		

		// Abilito la gestione degli 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>',

			),

		),

		

		// per usare il MySQL database		

		'db'=>array(

			'connectionString' => 'mysql:host=localhost;dbname=yii_tour',

			'emulatePrepare' => true,

			'username' => 'la tua user',

			'password' => 'la tua psw',

			'charset' => 'utf8',

		),

		

		'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'=>'pino@gmail.com',

	),

);



  1. Avendo abilitato l’installazione automatica delle tabelle necessarie con

     'rights'=&gt;array(
    
    
     	'install'=&gt;true,
    

    )

posso a questo punto testare da web il modulo

…/index.php/rights/

e se tutto ha funzionato dovrebbe aver creato e popolato le nuove tabelle AuthAssignment, AuthItem, AuthItemChild

In questa discussione puoi trovare ulteriori utili suggerimenti per risolvere eventuali problemi con l’installazione di rights

  1. una volta fatta l’installazione, ricordarsi di disabilitarla andando a modificare nel main.php



		'rights'=>array(

			'install'=>false, // Disabilita l'installer.

		),		



8) Ricordarsi di abilitare yii per la gestione delle autenticazioni via db

  1. Comprendere come gestire le autorizzazioni

Potrebbe esserti d’aiuto anche questa piccola applicazione didattica per approfondire la costruzione di un form che implementa login e registrazione

Sono contento che sei arrivato tra noi!!!! Facciamola cresciamola questa communityii!!!!

Ed io sono contento di aver conosciuto una persona preparata come te,

[ (anche se potrebbe sbottonarsi molto di più :slight_smile:

mi riferisco a quell’indizio che mi hai dato e che non ho colto, a cui dovrò dedicare la giornata di domani :slight_smile: ]

Mamma mia quante perle, forza ragazzi vi seguo attentamente, anch’io grazie a sensorario stò finalmente assaporando le qualità di Yii, gran lavoro Giancarlo, continua così.

Io sono ancora qualche km dietro, ma prometto crescita :P

P.S.

Da dove reperite i moduli/estensioni, dal web o solo yiiframework.com ? Giusto x capire come focalizzare le mie ricerche.

Grazie per l’incoraggiamento, ma guarda che io ho iniziato solo 2 settimane prima di te. Aveva ragione sensorario quando diceva che la curva di apprendimento di yii è molto semplice da scalare e si fa in fretta a prendere velocità.

Io ho notato che i nostri post vengono indicizzati su google in meno di un’ora. Da qui il mio trucchetto personale:

  1. vado su google

  2. digito yii + domanda qualunque in italiano

  3. se trovo risposta ok

altrimenti posto un nuovo topic in italiano avente come titolo la domanda che meglio riassume il mio dubbio (like yahoo answer) così che i postumi abbiano vita facile

  1. sempre per aiutare tutti, quando scrivo, cerco di linkare il più possibile ad altri post che ho trovato interessanti, così da semplificare ulteriormente la ricerca per gli altri

io sto cercando di installare rights

ma ricevo questo errore

Application web user must extend the RWebUser class.

Ho seguito alla lettera sia le tue indicazione che il pdf

sapete aiutarmi?

devi avere un model User che eredita da RWebUser, se non si chiama User lo devi specificare in configurazione.

nel pdf di rights è ben specificato

ciao, io la classe User nei modelli che estende RWebUser, ma continua a darmi lo stesso errore

Application web user must extend the RWebUser class.

Grazie per la risposta

Quando arriva la 2^ parte :D della guida ? Io ho installato rights, ma sinceramente non è ben chiaro cosa e come faccia a gestire i singoli users…

grazie

Sorge una domanda, perchè crei un campo "remember" nella tabella?

Bravo Giuseppe, ti faccio i complimenti per il tuo spirito di osservazione. Significa che la guida te la stai studiando per bene per capire a fondo i meccanismi di questo fantastico framework 2.0

La guida l’ho costruita raccogliendo informazioni sparse un pò qua ed un pò la.

In realtà in questa specifica guida, quel campo non sembra servire e puoi anche eliminarlo.

Ciao Ragazzi,

complimenti a tutti voi che aiutate noi novellini a crescere in fretta !

ho seguito la guida ma quando provo ad accedere a rights mi viene questo:

index.php/rights/

Alias "rights.RightsModule" is invalid. Make sure it points to an existing PHP file.

[html]

<?php

return array(

'basePath'=&gt;dirname(__FILE__).DIRECTORY_SEPARATOR.'..',


'name'=&gt;'Client Manager',





'language'=&gt;'it',//W l'Italia 


'sourceLanguage'=&gt;'it_IT',//W l'italiano





// preloading 'log' component


'preload'=&gt;array('log'),





// autoloading model and component classes


'import'=&gt;array(


	'application.models.*',


	'application.components.*',


//Per usare il modulo RIGHTS 


    'application.modules.rights.*',  // Le paths contenenti rights


    'application.modules.rights.components.*', //I:&#092;prova&#092;demo&#092;protected&#092;modules&#092;rights


    //Vedi anche la guida 


    //http://yii-rights.googlecode.com/files/yii-rights-doc-1.2.0.pdf





),





'modules'=&gt;array(


	


	'gii'=&gt;array(


		'class'=&gt;'system.gii.GiiModule',


		'password'=&gt;'0504',


	 	// If removed, Gii defaults to localhost only. Edit carefully to taste.


		'ipFilters'=&gt;array('127.0.0.1','::1'),


	),


),





// application components


'components'=&gt;array(


	'user'=&gt;array(


		'class'=&gt;'RWebUser',


		'allowAutoLogin'=&gt;true,


	),


    'authManager' =&gt; array(


        'class'=&gt;'RDbAuthManager',


    ), 


    


	// uncomment the following to enable URLs in path-format


	


	'urlManager'=&gt;array(


		'urlFormat'=&gt;'path',


		'rules'=&gt;array(


			'&lt;controller:&#092;w+&gt;/&lt;id:&#092;d+&gt;'=&gt;'&lt;controller&gt;/view',


			'&lt;controller:&#092;w+&gt;/&lt;action:&#092;w+&gt;/&lt;id:&#092;d+&gt;'=&gt;'&lt;controller&gt;/&lt;action&gt;',


			'&lt;controller:&#092;w+&gt;/&lt;action:&#092;w+&gt;'=&gt;'&lt;controller&gt;/&lt;action&gt;',


		),


	),


	


	'db'=&gt;array(


		'connectionString' =&gt; 'mysql:host=localhost;dbname=customer_services_db',


		'emulatePrepare' =&gt; true,


		'username' =&gt; 'root',


		'password' =&gt; '',


		'charset' =&gt; 'utf8',


	),


	'errorHandler'=&gt;array(


		// use 'site/error' action to display errors


        'errorAction'=&gt;'site/error',


    ),


	'log'=&gt;array(


		'class'=&gt;'CLogRouter',


		'routes'=&gt;array(


			array(


				'class'=&gt;'CFileLogRoute',


				'levels'=&gt;'error, warning',


			),


			// uncomment the following to show log messages on web pages


			/*


			array(


				'class'=&gt;'CWebLogRoute',


			),


			*/


		),


	),


),


'modules'=&gt;array(


    'rights'=&gt;array(


        'superuserName'=&gt;'Admin', // Name of the role with super user privileges. 


        'authenticatedName'=&gt;'Slave', // Name of the authenticated user role. 


        'userIdColumn'=&gt;'uteID', // Name of the user id column in the database. 


        'userNameColumn'=&gt;'UteNick', // Name of the user name column in the database. 


        'enableBizRule'=&gt;true, // Whether to enable authorization item business rules. 


        'enableBizRuleData'=&gt;false, // Whether to enable data for business rules. 


        'displayDescription'=&gt;true, // Whether to use item description instead of name. 


        'flashSuccessKey'=&gt;'RightsSuccess', // Key to use for setting success flash messages. 


        'flashErrorKey'=&gt;'RightsError', // Key to use for setting error flash messages. 


        'install'=&gt;true, // Whether to install rights. 


        'baseUrl'=&gt;'/rights', // Base URL for Rights. Change if module is nested. 


        'layout'=&gt;'rights.views.layouts.main', // Layout to use for displaying Rights. 


        'appLayout'=&gt;'application.views.layouts.main', // Application layout.


        'cssFile'=&gt;'rights.css', // Style sheet file to use for Rights. 


        'install'=&gt;false, // Whether to enable installer. 


        'debug'=&gt;false, // Whether to enable debug mode.


        'install'=&gt; true,


        ),


),


// application-level parameters that can be accessed


// using Yii::app()-&gt;params['paramName']


'params'=&gt;array(


	// this is used in contact page


	'adminEmail'=&gt;'fabiomannelli88@gmail.com',


),

);

?>

[/html]

ehm attento, vedi la parte relativi al precaricamento moduli:


  'modules'=>array(

                

                'gii'=>array(

.

.

.

.

.



è qui dentro che devi dichiarare il modulo rights, non devi creare una nuova struttura:


'modules'=>array(

        'rights'=>array(

            'superuserName'=>'Admin', // Name of the role with super user privileges. 

            'authenticated.....

metti


'rights'=>array(

            'superuserName'=>'Admin', // Name of the role with super user privileges. 

            'authenticatedName'=>'Slave', // Name of the authenticated user role. 

            'userIdColumn'=>'uteID', // Name of the user id column in the database. 

            'userNameColumn'=>'UteNick', // Name of the user name column in the database. 

            'enableBizRule'=>true, // Whether to enable authorization item business rules. 

            'enableBizRuleData'=>false, // Whether to enable data for business rules. 

            'displayDescription'=>true, // Whether to use item description instead of name. 

            'flashSuccessKey'=>'RightsSuccess', // Key to use for setting success flash messages. 

            'flashErrorKey'=>'RightsError', // Key to use for setting error flash messages. 

            'install'=>true, // Whether to install rights. 

            'baseUrl'=>'/rights', // Base URL for Rights. Change if module is nested. 

            'layout'=>'rights.views.layouts.main', // Layout to use for displaying Rights. 

            'appLayout'=>'application.views.layouts.main', // Application layout.

            'cssFile'=>'rights.css', // Style sheet file to use for Rights. 

            'install'=>false, // Whether to enable installer. 

            'debug'=>false, // Whether to enable debug mode.

            'install'=> true,

            ),



subito dopo il modulo GII … e dimmi

p.s.

poi non capisco perchè ripeti il parametro ‘install’=>true per tre volte nel modulo rights ??? ne basta uno!

posizionamento corretto:




'modules'=>array(

		// uncomment the following to enable the Gii tool

		

		'gii'=>array(

			'class'=>'system.gii.GiiModule',

			'password'=>'mia-password',

		 	// If removed, Gii defaults to localhost only. Edit carefully to taste.

			'ipFilters'=>array('127.0.0.1','::1'),

		),

        

               

                

                'rights'=>array(

                'install'=>false, // Enables the installer.

                'debug'=>true,

                ),

		

	),

se ti chiedi come mai uso solo 3 parametri per "rights", è perchè se le altre impostazioni ti stanno bene di default è inutile ridichiararle, le dichiari solo se i valori di default non ti piacciono.

Pasquale, grazie per la chiacchierata di ieri in privato. Ho visto che adesso mi hai superato… sai più cose di me.

Comunque grazie al tuo contributo, ora posso scrivere la seconda parte della guida, ovvero:

Ma una volta installato rights, come si utilizza?

In questo esempio, useremo qualcosa di noto a molti, il 3° video degli screen cast, quello che spiega come creare la logica CRUD per la tabella tbl_message e crea il controller Message.

Seguito quel tutorial, ora possiamo modificare il Controller per dirgli che la gestione degli accessi l’affidiamo a Rights.

Pertanto bisogna:

  1. estendere da RController anziché Controller

  2. modificare la function filters() restituendo rights anziché accessControl

  3. A questo punto la funzione accessRules non dovrebbe più servire dato che ci pensa rights (io l’ho remmata)

Come sempre riporto l’unità completa, per una maggior comprensione di quanto spiegato:


<?php


class MessageController extends RController //Inizialmente estendeva da Controller, ma dato che voglio affidare il controllo degli accessi a Rights... 

{

	/**

 	* @var string the default layout for the views. Defaults to '//layouts/column2', meaning

 	* using two-column layout. See 'protected/views/layouts/column2.php'.

 	*/

	public $layout='//layouts/column2';


	/**

 	* @return array action filters

 	*/

	public function filters()

	{

		return array(

			//'accessControl', // esegue il controllo d'accesso per le operazioni CRUD

   			'rights', //Delego all'estensione rights il compito di controllare gli accessi

		);

	}

	

	/**

 	* Specifies the access control rules.

 	* This method is used by the 'accessControl' filter.

 	* @return array access control rules

 	

	public function accessRules()

	{

		return array(

			array('allow',  // allow all users to perform 'index' and 'view' actions

				'actions'=>array('index','view'),

				'users'=>array('*'),

			),

			array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions'=>array('create','update'),

				'users'=>array('@'),

			),

			array('allow', // allow admin user to perform 'admin' and 'delete' actions

				'actions'=>array('admin','delete'),

				'users'=>array('admin'),

			),

			array('deny',  // deny all users

				'users'=>array('*'),

			),

		);

	}

*/

	/**

 	* Displays a particular model.

 	* @param integer $id the ID of the model to be displayed

 	*/

	public function actionView($id)

	{

		$this->render('view',array(

			'model'=>$this->loadModel($id),

		));

	}



Bene è tutto. Non rimane che iniziare a giocare con l’estensione:

  1. Collegarsi su …/index.php?r=rights

  2. creare dei ROLES (che sono i ruoli a cui collegare i tuoi utenti)

per es. io ho UfficioAcquisti (che poi assegnerò agli utenti)

  1. andare su PERMESSI e cliccare su "Generate items form controller actions"

scegliere i controller che voglio assegnare

(per esempio message.*)

  1. A questo punto compare una tabella

che mostra sulle righe controllers/actions

e su colonne i RUOLI

come la battaglia navale

basta cliccare su Assegna/Revoca per decidere quali gruppi abilitare e quali disabilitare.

Buon divertimento e grazie ancora a Paskuale senza il quale non avrei mai potuto scrivere il seguito di questo amato sequel

Magari questa volta, date un + a me ed uno a Pasquale…

come diceva il buon vecchio Muttley: medaglia, medaglia, medaglia

Salve a Tutti!

mi chiamo Fabio e sono nuovo della comunità e più in generale del mondo Yii.

Per la prima volta mi accingo ad usare un framework MVC e ho scelto di iniziare con Yii perchè lo trovo straordinario.

Sto trovando non poche difficoltà nel capire il sistema di gestione delle RBAC e stavo seguendo la guida di Giancarlo (ti ringrazio per il tempo dedicato nel creare alcuni post d’aiuto per i nuovi arrivati) e mi sono imbattuto in un errore che fortunamente ho risolto da solo ma che voglio condividere con voi nel caso in cui qualcuno si ritrovasse nella mia stessa condizione.

L’errore che mi dava a fine installazione era il seguente:


Alias "rights.RightsModule" is invalid. Make sure it points to an existing PHP file.

questo perché io ho impostato la cartella protected al gruppo www-data con permessi 755.

e allora basta dare terminale i seguenti comandi da terminale e tutto funzionerà:


cd tua_web_application/protected


chown www-data -R modules/

(nel mio caso sono stato io a doverla creare)


chgrp www-data -R modules/

(nel mio caso sono stato io a doverla creare)


chmod 775 -R modules/

(potete provare anche ad impostarli come 666 o 777,fate come meglio credete)

guida perfetta solo che ti volevo chiedere una cosa!!! come imposto un utente che ha accesso a tutte le operazioni senza dover aggiungere tutti i controller?

mi spiego meglio, è possibile impostare una regola che mi fa dare accesso a tutto su una sola riga senza dover dare accesso a ogni singolo controller?

Gli admin, hanno accesso a tutti i controller

Se invece intendevi dire che vuoi assegnare tutti i metodi di un controller ad un utente, ti è sufficiente creare controller.*

e infatti è come avevo capito però io ho in tabella due utenti admin demo ma se entro con admin senza aver impistato i permessi anche per quello non mi accede a niente

nel config ho questo




          'rights' => array(

              'userClass' => 'Utenti',

              'install' => false, // Abilita l'installer.

              'userIdColumn' => 'id', // Il nome della colonna user id nel database.

              'userNameColumn' => 'username', // Il nome della colonna name nel database.

              'superuserName' => 'admin', // Name of the role with super user privileges.

              'authenticatedName' => 'authenticated', // Name of the authenticated user role.

          ),



nel controller




class DashboardController extends RController

{

	/**

	 * @return array action filters

	 */

	public function filters()

	{

		return array(

			'rights', // perform access control for CRUD operations

		);

	}