regole di accesso

ciao a tutti,

uso da poco YII… e sono davvero molto contento. mi permette di risparmiare un sacco di tempo, oltre al fatto che generea codice valido, il che è assai comodo.

purtroppo trovo che la documentazione sia un po’ povera, mancano dei tutorial chiari e completi… ecco perché mi rivolgo a voi:

ho collegato il component USerIdentity ad una tabella utenti. Sulla tabella memorizzo un valore equivalente al livello dell’utente. Mettiamo che per semplicità io abbia solo utenti amministratori e normali. Ho poi molti modelli, tra cui models/User.php, e vorrei fare in modo che:

  • gli utenti amminsitratori possano effettuare tutte le azioni

  • gli utenti normali possano accedere solo al proprio profilo utente

per distinguere tra utenti normali ed amminsitratori ho modificato il file components/UserIdentity.php inserendo:




private $_level;

[...]

$this->_level=$user->powerUser;



Ora… devo modificare il file controllers/UserController.php ? qualcuno mi sa dire come?

grazie mille

Se hai pochi ruoli, puoi usare le expression nelle acces rules.

Per esempio, dovendo distinguere solo fra admin e users, io ho fatto così

In UserIdentity (nel caso l’autenticazione abbia successo):




$this->_id = $user->id;

$this->username = $user->user_name;

$this->setState('role', strtolower($user->type->name));			

$this->errorCode = self::ERROR_NONE;



poi ho creato un controller base da cui ereditano tutti gli altri controller

con queste regole




	public function accessRules()

	{

		return array(

			array('allow', // admins can do everything

				'expression'=>'Yii::app()->user->getState("role")=="admin"',			

			),

			array('deny', // users cannot create/update/delete

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

				'expression'=>'Yii::app()->user->getState("role")=="user"', // or !="admin" if you have more than 2 roles			

			),

			array('allow',  // allow all anonymous users to perform login actions

				'actions' => array('login'),

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

			),

			array('deny',  // deny all anonymous users

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

			),

		);

	}



in questo modo solo gli utenti admin potranno accedere alle action create/update e delete

mentre per tutti gli altri verrà generata un’eccezione.

nel tuo caso diventerebbe




	public function accessRules()

	{

		return array(

			array('allow', // admins ca do everything

				'expression'=>'Yii::app()->user->getState("role")=="admin"',			

			),

			array('allow', // users can see their profiles

				'actions' => array('profile'),

				'expression'=>'Yii::app()->user->getState("role")=="user"',			

			),

			array('allow',  // allow all anonymous users to perform login actions

				'actions' => array('login'),

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

			),

			array('deny',  // deny all users

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

			),

		);

	}



Se hai bisogno di dare accesso anche agli utenti con privilegi minori a determinate sezioni,

puoi fare l’override della funzione accessRules nel tuo controller, seguendo la stessa logica.

Tutto ciò che non è esplicitamente vietato, è concesso, ecco perché nel mio caso non devo

dare accesso agli utenti di tipo user, perché ad essere vietato è l’accesso ai soli utenti non

autenticati.

Devo solo vietargli l’acesso ale azioni che non voglio possa eseguire.

Spero di esserti stato d’aiuto.

grazie mille, sei stato chiarissimo!! :)

Quindi se voglio impedire a chi si chiama Stefano di aggiornare, creare, eliminare qualche cosa in un determinato modulo posso fare così:




        public function accessRules()

        {

                return array(

                        [...]

                        array('deny',

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

                                'expression'=>'Yii::app()->user->getName()!="Stefano"',

                        ),

                        [...]

                );

        }



So che la richiesta sembra illogica ma non lo è: voglio capire quanto è versatile Yii.

ultimamente ho usato spesso un’estensione che si chiama rights…

usandola si può non solo creare ed usare ruoli & co con molta faclitità, ma anche attribuire a chiunque i permessi su operazioni specifiche.

http://www.yiiframework.com/forum/index.php?/topic/10556-extension-rights/