2013-03-30 10 views
10

Esistono numerose esercitazioni introduttive su come implementare zfc-user e zfc-rbac in Zend Framework 2. Le pagine github per zfc-user e zfc-rbac (https://github.com/ZF-Commons) sono chiari e l'implementazione è davvero piuttosto semplice (come indicato in molte delle esercitazioni). Ho anche trovato gli schemi SQL necessari per zfc-user e zfc-rbac (/ vendor/zf-commons/zfc- [user/rbac]/data /).Zend Framework 2 con popolazione di database zfc-rbac

La creazione di un utente nel database è semplice, poiché l'utente zfc lo ha già impostato per voi (http://example.com/user). Tutto bene finora. Ora voglio popolare i ruoli, ma non mi è chiaro come compilare correttamente le tabelle rbac. La mancanza di informazioni su questo mi sorprende, dal momento che il componente zfc-rbac è un modulo popolare per Zend Framework.

Capisco il principio del controllo di accesso basato sui ruoli e la popolazione delle tabelle per le autorizzazioni e la tabella che collega le autorizzazioni ei ruoli insieme sono chiari, è la tabella dei ruoli che non mi è chiara. Capisco che puoi avere un ruolo che ha un ruolo padre, ma non è chiaro come popolare la tabella con un ruolo padre poiché esiste un vincolo di chiave esterna che afferma che 'parent_role_id' deve essere un 'role_id'.

Di seguito si riporta il codice SQL per la tabella di ruolo (questa è la SQL fornito da zfc-RBAC):

CREATE TABLE `rbac_role` (
    `role_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_role_id` int(11) unsigned NOT NULL, 
    `role_name` varchar(32) NULL, 
    PRIMARY KEY (`role_id`), 
    KEY `parent_role_id` (`parent_role_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

ALTER TABLE `rbac_role` 
    ADD CONSTRAINT `rbac_role_ibfk_1` FOREIGN KEY (`parent_role_id`) REFERENCES `rbac_role` (`role_id`); 

Con la chiave esterna in luogo l'aggiunta di un ruolo di genitore sembra impossibile?

INSERT INTO `rbac_role` (parent_role_id, role_name) VALUES (NULL, 'admin'); 

Fondamentalmente la mia domanda è (e mi sento molto stupido per aver posto questa), ma come si fa un inserto per un ruolo padre assomiglia? E se la dichiarazione di inserimento che ho presentato è in realtà corretta, devo sempre rimuovere la chiave esterna prima di inserire un ruolo genitore?

+8

Non sono esperto di SQL, ma questa associazione auto-referenziata sembra essere falsa. Il 'parent_role_id' HAS deve poter essere' NULL', perché altrimenti non sarai MAI in grado di inserire una prima riga di dati. – Sam

+0

D'accordo con @Sam, 'parent_role_id' dovrebbe essere nullable – Crisp

+0

Questo è quello che pensavo. Grazie. È strano però che zfc-rbac fornisca la dichiarazione della tabella create WITH quella chiave esterna, che dovrebbero o spiegare di più o lasciarla fuori perché questo è un po 'di confusione. –

risposta

0

Cambia la tua creare la tabella al seguente:

CREATE TABLE `rbac_role` (
    `role_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_role_id` int(11) unsigned NULL, 
    `role_name` varchar(32) NULL, 
    PRIMARY KEY (`role_id`), 
    KEY `parent_role_id` (`parent_role_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

noti che parent_role_id è NULL invece di NOT NULL. Se parent_role_id NON è NULL vuol dire che deve avere un genitore ma poiché il riferimento alla chiave esterna è nella stessa tabella non c'è modo di inserire una riga genitore!

0

fyi: questo problema è stato risolto. La versione 0.2.0 di zfc-rbac consentirà il valore NULL come parent_role_id