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?
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.
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
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à:
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.
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.
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.
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:
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.
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.