RBAC, più roles per utente?

E’ possibile assegnare più Roles ad un unico utente?

Mettiamo il caso che sto sviluppando un blog e creo una struttura RBAC per esso.

Ora mi espando e voglio creare una sezione per inserire dei documenti, e voglio creare una struttura RBAC slegata dal blog, ma voglio che un utente possa essere al contempo "moderatore" del blog e "uploader" per la documentazione, senza però legare Moderatore con Uploader. Quindi posso anche avere un Reader Uploader, ad esempio.

Consigli?

Grazie :)

Ho avuto un problema analogo al tuo. Non dovendo fare una gestione dei ruoli, però, ho dovuto fare tutto a mano. L’aiuto che posso darti, è dirti che ti basta aggiungere alla tabella AuthAssignment un nuovo record per ogni ruolo che vuoi assegnare ad un utente.

Questa query potrebbe esserti di aiuto (è una mia tabella che sto usando e che funziona).




INSERT INTO `AuthAssignment` (`id`, `itemname`, `userid`, `bizrule`, `data`) VALUES

  ('1', 'editContent', '1', NULL, 'N;'),

  ('2', 'editNews', '1', NULL, 'N;');



Se vuoi fare una cosa più ordinata:




$auth=Yii::app()->authManager;

$auth->createOperation('operazione','Crea una nuova operazione');


$role = $auth->createRole('scrivi Blog', 'creata regola');

$role->addChild('operazione');

$role = $auth->createRole('fai altra roba', 'creata regola');

$role->addChild('operazione');


$auth->assign('scrivi Blog',1);

$auth->assign('fai altra roba',1);



PS. Il codice PHP che ho scritto non l’ho testato ma in teoria dovrebbe fare al caso tuo.

Grazie per avermi risposto sensorario.

Ho risolto installando (con qualche difficoltà per via del file SQL con sintassi errata) il modulo più fantastico che ho provato: RIGHTS.

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

Interfaccia fantastica per ruoli, task e operation. Da provare.

Nuooooooooooo mitico. Ho appena finito un sito web. RBAC ha un RBAC manager ma non mi piace per nulla. Mi sono fatto una cosa da me. Appena posso mi guardo RIGHTS.

Se hai problemi con la sua installazione installa manualmente le tabelle del db con la mia versione corretta:




drop table if exists AuthAssignment;

drop table if exists AuthItemChild;

drop table if exists AuthItem;

drop table if exists Rights;


create table AuthItem

(

   name varchar(64) not null,

   type integer not null,

   description text,

   bizrule text,

   data text,

   primary key (name)

) ENGINE = INNODB;


create table AuthItemChild

(

   parent varchar(64) not null,

   child varchar(64) not null,

   primary key (parent,child),

   foreign key (parent) references AuthItem (name) on delete cascade on update cascade,

   foreign key (child) references AuthItem (name) on delete cascade on update cascade

) ENGINE = INNODB;


create table AuthAssignment

(

   itemname varchar(64) not null,

   userid varchar(64) not null,

   bizrule text,

   data text,

   primary key (itemname,userid),

   foreign key (itemname) references AuthItem (name) on delete cascade on update cascade

) ENGINE = INNODB;





create table Rights

(

	itemname varchar(64) not null,

	type integer not null,

	weight integer not null,

	primary key (itemname),

	foreign key (itemname) references AuthItem (name) on delete cascade on update cascade

) ENGINE = INNODB;




create table User

(

   id integer not null auto_increment,

   username varchar(128) not null,

   password varchar(128) not null,

   primary key (id)

) type=InnoDB, character set utf8;



Per altri problemi non esitare a contattarmi!

Appena finisco questo lavoro inizio a guardare sicuramente l’estensione che mi hai segnalato.

So che l’argomento è chiuso ma credo di dover puntualizzare una faccenda:




-- 

-- Structure for table `AuthAssignment`

-- 


DROP TABLE IF EXISTS `AuthAssignment`;

CREATE TABLE IF NOT EXISTS `AuthAssignment` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `itemname` varchar(64) NOT NULL,

  `userid` varchar(64) NOT NULL,

  `bizrule` text,

  `data` text,

  PRIMARY KEY (`id`),

  KEY `id` (`id`)

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


-- 

-- Data for table `AuthAssignment`

-- 


INSERT INTO `AuthAssignment` (`id`, `itemname`, `userid`, `bizrule`, `data`) VALUES

  ('1', 'editContent', '1', NULL, 'N;'),

  ('2', 'editNews', '1', NULL, 'N;'),

  ('3', 'adminContents', '1', NULL, 'N;');


-- 

-- Structure for table `AuthItem`

-- 


DROP TABLE IF EXISTS `AuthItem`;

CREATE TABLE IF NOT EXISTS `AuthItem` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(64) NOT NULL,

  `type` int(11) NOT NULL,

  `description` text,

  `bizrule` text,

  `data` text,

  PRIMARY KEY (`id`),

  UNIQUE KEY `name` (`name`)

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


-- 

-- Data for table `AuthItem`

-- 


INSERT INTO `AuthItem` (`id`, `name`, `type`, `description`, `bizrule`, `data`) VALUES

  ('4', 'editNews', '2', 'Edita tutti i contenuti delle News.', NULL, 'N;'),

  ('3', 'editContent', '2', 'Modifica i contenuti del sito.', NULL, 'N;'),

  ('5', 'adminContents', '2', 'Amministratore di tutto il sito compresi i contenuti.', NULL, NULL);




Ti mostro questo dump (fatto con chive eheheh) perchè oltre ad aggiungere un record in AuthAssignment se ne deve aggiungere uno anche in AuthItem. Si lo so che ci sono strumenti per fare tutto automaticamente, però quella è “tecnologia”. Ho ficcato il naso nei mattoni del database dell’RBAC e volevo tornare qui a puntualizzare la cosa per non lasciare una informazione a metà. Magari non serve a nulla analizzare il db ma almeno siamo consapevoli di cosa accade sotto al guscio di Yii e dell’RBAC =).

Comunque, per rispondere alla domanda originale, si’, e’ possibile e consigliato assegnare piu’ ruoli agli utenti.

E’ per questo che esiste la tabella ponte AuthAssignment

Il problema è che (anche se ora uso ROLES extension quindi non mi si pone il problema) AuthAssignment:




create table AuthAssignment

(

   itemname             varchar(64) not null,

   userid               varchar(64) not null,

   bizrule              text,

   data                 text,

   primary key (itemname,userid),

   foreign key (itemname) references AuthItem (name) on delete cascade on update cascade

);



primary key (itemname,userid), se è primaria come fa a farmi più di una assegnazione senza darmi errore?

E’ una superchiave, ovvero una chiave composta da due campi. itemname è l’id del ruolo e userid quello dell’utente. La stessa copppia è superchiave in quanto non potrà MAI comparire due volte nella stessa tabella.

Illuminante, grazie!

Quando dico cose sagge, se lo desideri puoi cliccare su quel più verde in basso a destra. Così io sono incentivato a darti risposte sempre migliori e tu a ringraziarmi. =) Oh! Ovvio che vale anche l’esatto contrario: se e quando tu darai a me una risposta utile … sarà mio dovere premiarti.

Sensorario, hai iniziato la scalata ai vertici del forum?

Buon viaggio! Quando arriverai ai massimi livelli apriremo una sezione "Little italy" solo per italian-speaker super quotati!

Forse volevi dire Little Yiitaly

Lo faccio sempre :)

Scusami, dopo il titolo del bignamino non ho potuto resistere… :)

Ad ogni modo, sono al mio primo progetto con Yii e non ho potuto fare a meno di utilizzare Rights: semplicemente spettacolare.

Semplice, potente e facilissimo sia da installare che da usare. Documentazione OK. Suggerito a tutti.

La cosa che mi è piaciuta moltissimo è che ti consente di far crescere il meccanismo di assegnazione dei diritti insieme alla applicazione. Man mano che implementi nuovi metodi nei controller, lui è in grado di rilevarli e farli diventare “elementi” da assegnare. Geniale :)

Ragazzi l ho installato… ma come applico il controllo??? o meglio ho assegnato ruoli ecc… devo aggiungere qualcosa nel "controllers" del mio progetto??

Il tuo controller deve estendere quello del modulo:


class MioController extends RController

Deve contenere il filtro del modulo:




    public function filters()

    {

        return array(

            'rights',

        );

    }



E opzionalmente contenere i nomi dei metodi(action) visibili da tutti:




    public function allowedActions()

    {

        return 'idaction';

    }



Perfetto grazie mille!!