Yii Framework Forum: RBAC, più roles per utente? - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

RBAC, più roles per utente? Rate Topic: -----

#1 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 10 March 2011 - 05:29 PM

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 :)
0

#2 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 11 March 2011 - 06:15 AM

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.
1

#3 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 11 March 2011 - 10:08 AM

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.yiiframew...tension-rights/

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

#4 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 11 March 2011 - 10:12 AM

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.
0

#5 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 11 March 2011 - 11:24 AM

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!
0

#6 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 11 March 2011 - 11:33 AM

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

#7 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 12 March 2011 - 10:50 AM

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 =).
0

#8 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 14 March 2011 - 06:24 AM

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
0

#9 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 14 March 2011 - 10:56 AM

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?
0

#10 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 14 March 2011 - 11:19 AM

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.
1

#11 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 14 March 2011 - 04:52 PM

View Postsensorario, on 14 March 2011 - 11:19 AM, said:

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!
0

#12 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 14 March 2011 - 06:39 PM

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.
0

#13 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 15 March 2011 - 05:27 AM

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!
0

#14 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 15 March 2011 - 07:25 AM

Forse volevi dire Little Yiitaly
1

#15 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 15 March 2011 - 03:58 PM

View Postsensorario, on 14 March 2011 - 06:39 PM, said:

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.


Lo faccio sempre :)
0

#16 User is offline   d4rkstar 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 19-February 11
  • Location:Naples / Italy

Posted 15 March 2011 - 04:33 PM

View Postsensorario, on 15 March 2011 - 07:25 AM, said:

Forse volevi dire Little Yiitaly


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 :)
0

#17 User is offline   Duma 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 39
  • Joined: 13-March 11

Posted 19 March 2011 - 06:30 AM

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

#18 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 19 March 2011 - 11:15 AM

View PostDuma, on 19 March 2011 - 06:30 AM, said:

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';
    }

1

#19 User is offline   Duma 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 39
  • Joined: 13-March 11

Posted 21 March 2011 - 01:42 AM

Perfetto grazie mille!!
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users