Tutorial Yii Users e Rights

Scritto da Gianjey | 27 giugno, 2012 12:18

yiiFrameworkOk 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:

  1. 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)
  2. 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'),
                    ),
    #...
            ),
    #...
    );
    
  3. 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.
  4. 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_'
    		),
    
  5. 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),
    			),
    		)); ?>
    
  6. Ora potrete loggarvi con gli utenti di default creati dallo script:
    • admin/admin
    • demo/demo
A questo punto la vostra applicazione si presenterà cosi:
loginYiiUser

Login dell'utente admin

gestione Utenti Yii Users

Gestione Utenti Yii Users

Ora passiamo all’installazione di Rights:
  1. Scarichiamo il modulo Rights (la versione che ho usato io è la 1.3.0.r147)
  2. Scompattiamo il contenuto sotto /webapp/protected/modules/rights
  3. 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.*',
    	),
    
  4. 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,
            ),
    ),
    
  5. Sempre nel config sotto la sezione components aggiungete
    	'authManager'=>array(
                    'class'=>'RDbAuthManager',
                    'connectionID'=>'db',
                    'defaultRoles'=>array('Authenticated', 'Guest'),
            ),
    
  6. A questo punto lanciate lo script di installazione di rights http://localhost/nomeapplicazione/rights e seguite le istruzioni
  7. Ora rimuovete dal config la sezione di install di rights
    'rights'=>array(
         'install'=>false, // Disabilita l'installer.
    ),
    
  8. 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

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

4 risposte a “Tutorial Yii Users e Rights”

  1. and scrive:

    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?

  2. Gianjey scrive:

    Prova a leggere la guida di rights e questo post sulla gestione dei permessi e dei ruoli

  3. rashmani scrive:

    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*

  4. rashmani scrive:

    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*

Lascia un Commento