[RISOLTO] Gestione di utenti, permessi, ruoli, ... ho un blocco

Ho creato questo database. Ho creato un utente, ho creato i ruoli, ed una tabella che associa ruoli ad utente. Ho anche creato la relazione MANY_MANY nel model.




CREATE TABLE IF NOT EXISTS `ruoli` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `nome` varchar(50) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


INSERT INTO `ruoli` (`id`, `nome`) VALUES

(1, 'amministratore'),

(2, 'commerciale'),

(3, 'segreteria'),

(4, 'capoprogetto');


CREATE TABLE IF NOT EXISTS `ruolidegliutenti` (

  `id_utente` int(11) NOT NULL,

  `id_ruolo` int(11) NOT NULL,

  PRIMARY KEY (`id_utente`,`id_ruolo`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `ruolidegliutenti` (`id_utente`, `id_ruolo`) VALUES

(1, 1),

(1, 2);


CREATE TABLE IF NOT EXISTS `utenti` (

  `id` int(1) NOT NULL AUTO_INCREMENT,

  `username` varchar(50) NOT NULL,

  `password` varchar(50) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;


INSERT INTO `utenti` (`id`, `username`, `password`) VALUES

(1, 'guest', 'ed368afd377f9c53c30972d4cfc267aa');



Ho bisogno di creare una gestione di permessi, gruppi ed utenti. Sto andando nella strada giusta? Ma sopratutto … come vado avanti?

No no, lascia stare.

Leggi la guida per quanto riguarda RBAC, Yii ha gia’ tutto pronto, non devi scrivere una sola riga.

Usa rbac con il database, si configura in main.php cosi’:




        'authManager'=>array(

            'class'=>'CDbAuthManager',

        ),



Poi devi aggiungere le tabelle che trovi in framework/web/auth/schema.sql ad e’ fatta.

Puoi chiamare Yii::app()->user->checkAccess(‘admin’)

io ho utilizzato i moduli user e rights per creare questo skeleton di applicazione web

http://code.google.com/p/yii-web-start/

user ti permette di gestire gli utenti creando dei profile dei campi necessari e rights la gestione rbac con interfaccia molto pulita e lineare (ti permette di creare le permissions sui metodi dei controller della tua applicazione)

se proprio devi utilizzare le tue tabelle utilizza gii per creare CRUD di ogni tabella e pi aggiusta a tuo piacimento. Ma ti conviene utilizzare tabelle InnoDB con chiavi esterne così gii ti riconosce anche le relazioni senza doverle aggiungere a mano.

ciao

Ecco… infatti mi ricordavo di qualche cosa del genere. Vado, leggo, studio e programmo.

Si beh, sto seguendo la guida. Però mi aspettavo qualche cosa di più: non c’è un’interfaccia di gestione delle regole e dei permessi? A me piacerebbe andare nel mio pannellino di amministrazione, dire che gli amministratori fanno queste cose, i capi progetto queste altre, i commerciali queste altre ancora, … non mi è esattamente chiaro come viene gestita sta cosa da Yii. Comunque … andiamo avanti a leggere …

Il mio pessimismo si è trasformato in stupore. Ho seguito le tue indicazioni zaccaria. Ti voglio sempre più bene e ne voglio anche a Yii. Ho lanciato quanto segue:




/* Definisco tutte le operazioni del sistema */

$auth->createOperation('manageWorkflow', 'manage all stuff');

$auth->createOperation('gestisciCommesse', 'manage all stuff');

$auth->createOperation('gestisciClienti', 'manage all stuff');

$auth->createOperation('gestisciCommerciali', 'manage all stuff');


/* Creo la role super user e le assegno tutte le cose che si possono fare: */

$role = $auth->createRole('superUser');

$role->addChild('manageWorkflow');

$role->addChild('gestisciCommesse');

$role->addChild('gestisciClienti');

$role->addChild('gestisciCommerciali');


$auth->assign('superUser','demo');



Ho controllato le tabelle ed è tutto ok. Però io sono l’utente demo e se faccio




var_dump(Yii::app()->user->checkAccess('gestisciCommesse'));



ottengo un solenne




bool(false);



Attenzione!!!! Avrei dovuto fare




$auth->assign('superUser',1);



ovvero l’id del mio utente e non il mio username. Sono andato a vedere all’interno del database. Ho visto che ‘demo’ stava nella colonna ‘userid’ e non era semanticamente corretto. Quindi ci ho messo il mio id. Sono tornato nel mio browser. Ho premuto F5. Tutto è divenuto come avrebbe dovuto essere sin dal principio. Anche oggi ho imparato una faccenda nuova.

E siccome sono felice di questo, metto due faccine in segno di felicità: ::) ;D

Per completezza, mostro per chi ne potrebbe avere bisogno anche quello che ho inserito nel controller:




	public function accessRules()

	{

		return array(

			array('allow',

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

				'roles'=>array('manageWorkflow'),

			),

			array('deny',  // deny all users

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

			),

		);

	}



facendo notare che oltre alla keyword ‘users’ per indicare quali utenti possono essere abilitati o meno da una azione, possiamo usare ‘roles’ per abilitare, o meno, un’azione.

Ciao a tutti, appena registrato, senza un degna presentazione passo subito ad una domanda per sensorario che ha superato questo problema della gestione degli utenti.

Ho capito dove hai piazzato la funzione accessRules ma non mi è chiaro cosa intendi quando dici "ho lanciato quanto segue". Dove hai inserito quel codice ?

Da questa domanda si può perfettamente capire che mi sono appena affaciato a questo framework che sembra molto potente ma che mi spiazza su alcuni movimenti.

Saluti a tutti

accessRules lo trovi nel controller. In particolare nella cartella /protected/controllers/NomeController.php della tua applicazione. Per capirci, se ti trovi in index.php?r=site/intex sai che il controller è site e dunque il controller lo trovi dentro /protected/controllers/SiteController.php

Se hai ben chiaro l’MVC (Model View Control) non devo spiegarti che cosa sia sto controller. Se sbaglio fammelo notare che ti rispondo molto volentieri.

Ciao Ragazzi , mi sono appena iscritto ed ho iniziato ad usare Yii da pochi giorni…

avrei una domanda in merito a questa cosa:

Premetto che avevo già fatto le tabelle USER e GRUPPI dove ogni utente appartiene al proprio gruppo ed ho messo in relazione le 2 tabelle

USER GRUPPO

|_group_id -> id

ora vorrei che le autorizzazioni siano filtrare in base a id gruppo e non a id utente… come faccio ? :(

Grazie ,

Marco

Oi, è un po’ vaga come domanda. A prescindere ti sconsiglio di usare soluzioni from scratch: esistono già delle estensioni che fanno fare ad yii tutto quello che serve.

Ciao Sensorario,

anche io sto affrontando il problema "ACL".

In quale file vanno inserite ?

::)

Supponi di trovarti nel tuo UserController (insomma… nel controller dove salvi idati dell’utente). Quindi supponi di aggiornare un profilo. Ti trovi nel metodo:


UserController::actionUpdate();

Supponiamo ora che nella form per modificare i dati dell’utente tu avessi avuto a disposizione un elenco di ruoli:


UserController::actionUpdate(){

    [...]

    $auth->assign($role,$user->username);

    [...]

}

questa ovviamente è solo la parte dell’utente. Sarebbe opportuno costruirsi anche un’interfaccia per creare role ed operations


/* Definisco tutte le operazioni del sistema */

$auth->createOperation('manageWorkflow', 'manage all stuff');

$auth->createOperation('gestisciCommesse', 'manage all stuff');

$auth->createOperation('gestisciClienti', 'manage all stuff');

$auth->createOperation('gestisciCommerciali', 'manage all stuff');


/* Creo la role super user e le assegno tutte le cose che si possono fare: */

$role = $auth->createRole('superUser');

$role->addChild('manageWorkflow');

$role->addChild('gestisciCommesse');

$role->addChild('gestisciClienti');

$role->addChild('gestisciCommerciali');

Nel mio caso specifico, ho una serie di role fisse, quindi la creazione l’ho fatta usando il codice che vedi, ma poi l’ho immediatamente commentato. Quellop che faccio oggi, è assegare o meno un ruolo ad un utente.

intanto ti ringrazio per la risposta.

vedo se riesco a farlo parlare.

piu’ conosco yii e piu’ mi piace

Ah guarda. Io mi sono aperto un blog su yii per quanto amo yii.

Ah che bell’argomento, stò cercando di fare le cose facili gestire le autorizzazioni solo con il modulo rights, vediamo se l’ho capito bene …

1-> Creo due ruoli (magazzinieri, impiegati )

2-> L’utente FabioM lo assegno al ruolo “Magazzinieri”, mentre Pasqualinomaragià agli “Impiegati”

3-> Ora creo un permesso (controller/action) su Invio/pacchiRegali

4-> su Invio/pacchiRegali dò autorizzazione solo al ruolo "Impiegati"

:angry: :angry: accedono tutti !!!! Rights non mi filtra nulla :angry:

why ? thanks

n.b.

Ho usato il controller di rights (RController) stesso risultato…

@sensorario:

Quindi utilizzi i moduli user + rights?

Em… potresti quotare il messaggio a cui ti riferisci?

Beh se non va c’è sicuramente qualche cosa che non funziona bene: potresti mostrarci tutti i passaggi? Dal file di configurazione, al db, insomma tutto. Così a naso si fa fatica a comprendere dove stia l’errore.