Mostrare Voci Menu In Base Al Ruolo Utente

Salve, sono novizio di yii. Ho installato i moduli Right e User ma non ho capito una cosa.

Per quanto riguarda il menu è possibile mostrare solo alcune voci se l’ utente non è loggato o è un’ amministratore?

Mi spiego meglio, ho 10 voci nel menu ma vorrei che l’ utente Guest ne vedesse solo 5 almeno che non sia loggato.

Come risolvo questo problema?? E anche per quanto riguarda l’ accesso ad aclune pagine vorrei che solo utenti loggati o amministratori avessero accesso. Ci stò dando di matto !!! Se qualcuno può aiutarmi mi farebbe un grosso favore :)

Ciao,

anche io sono un novizio… quindi aspettiamo magari la conferma di qualcuno con più esperienza.

Io ho risolto così (file views/layouts/main.php se usi il tema default)




 $this->widget('zii.widgets.CMenu',array(

                    'items'=>array(

                        array('label'=>Yii::t('app','Home'), 'url'=>array('/site/index')),

                        array('label'=>Yii::t('app','About'), 'url'=>array('/site/page', 'view'=>'about')),

                        array('label'=>Yii::t('app','Contact'), 'url'=>array('/site/contact')),

                        array('label'=>Yii::t('app','Login'), 'url'=>array('/user/login'),'visible'=>Yii::app()->user->isGuest),

                        array('label'=>Yii::t('app','Profile'), 'url'=>array('/user/profile'),'visible'=>!Yii::app()->user->isGuest),

                        array('label'=>Yii::t('app','Employees'), 'url'=>array('/dipendenti'), 'visible'=>!Yii::app()->user->isGuest),

                        array('label'=>Yii::t('app','Rights'), 'url'=>array('/rights'), 'visible'=>Yii::app()->user->checkAccess(Rights::module()->superuserName)),

                        array('label'=>Yii::t('app','Users'), 'url'=>array('/user'), 'visible'=>Yii::app()->user->checkAccess(Rights::module()->superuserName)),

                        array('label'=>Yii::t('app','Logout'). '('.Yii::app()->user->name.')', 'url'=>array('/user/logout'), 'visible'=>!Yii::app()->user->isGuest)

                    ,

                )));



In altri casi, dovendo gestire il menu in base al ruolo ho fatto così:




if (fn::userHasRole("Medici")){

    $this->menu=array(

            array('label'=>'Manage Dipendenti', 'url'=>array('admin')),

    ); 

}else{

      $this->menu=array(

            array('label'=>'Create Dipendenti', 'url'=>array('create')),

            array('label'=>'Manage Dipendenti', 'url'=>array('admin')),

    );

}



la funzione


userHasRole

è così definita




class fn extends CApplicationComponent

{

     public function init() {

        }

    public function userHasRole($role){

          return (Yii::app()->authManager->checkAccess($role, Yii::app()->user->id));

      }

}



Il codice funziona… ma se qualcuno con esperienza conferma o smentisce siamo più tranquilli! :rolleyes:

Grazie

Ciao ettolo e grazie della risposta. :slight_smile:

Stasera provo il tuo codice e poi vediamo cosa dicono i più esperti.

A volte non sono proprio convinto di questo framework, nel senso che cmq anche qui di codice bisogna scriverne e richiamare sempre classi funzioni etc. Mi chiedo se con il php puro farei prima :-/ ??? Ma poi leggo commenti e guidizi di gente esperta che ancora non mi permettono di “mollare” questo framework, perchè leggendo i loro post…yii sembra quasi la svolta giusta. Tutti dicono che guadagni tempo nello sviluppo e anche se all’ inizio ne perdi un bel pò per capire come funziona (e io ne sto perdendo assai) alla fine sarai ripagato. Vedremo…io ancora non ne sono convinto del tutto. Sarà che devo sviluppare un applicazione complessa che comprende piu cose e nella quale quando sara finita saranno collegate più “persone” nel suo utilizzo. A livello singolo ho già creato con php questa applicazione ma per crearla a livello “globale” mi è stato consigliato questo framework xchè l’ applicazione dovra fare molte cose. Ora come ora…posso dirti che ci stò quasi dando di matto :smiley: . Oggi ho deciso di riniziare da capo il suo studio seguendo anche dei bei tutorial (in spagnolo) di Gustavo Salgado che collabora anche con Codigo Facilito. Vedremo che succede…mi sono dato un mese di tempo…poi prenderò la decisione…o continuo con yii…o torno al php puro. Che Dio ce la mandi buona!!!

Io ho incontrato yii più di un anno fa… ho letto il libro, seguito gli esempi… ma non è stato amore a prima vista.

Adesso devo anche io sviluppare qualcosa di serio e mi ci sono ributtato più seriamente: anche solo la gestione utenti e ruoli secondo me ripaga lo sforzo di comprenderlo!

io uso rbac

Nella view




$this->menu=array(

    array(

        'label'     => 'Listino', 

        'url'       => array('listino'),

        'visible'   => Yii::app()->user->checkAccess('<nome_del_ruolo_rbac>'),

    ),

);



continuo a non capire perchè installare Right, Users e non so che altro quando yii da solo fa già tutto

Grazie Realtebo,

in effetti la tua


Yii::app()->user->checkAccess($role)

è una maniera più elegante e compatta della mia


Yii::app()->authManager->checkAccess($role, Yii::app()->user->id)

Sono effettivamente intercambiabili, ho appena provato… quindi tengo la tua! :rolleyes:

Sull’utilità di installare Rights posso dirti, ma già lo saprai, che è la Gui per gestire RBAC, e per il poco che ho visto, lo fa decisamente bene.

Se hai bisogno che un admin possa inserire nuovi utenti ed assegnare ruoli, li è già tutto fatto… poi se hai un metodo alternativo che non sia la consolle, spiega! ;D

io sono admin, e preferisco un bel CConsoleCommand che gestisca gli rbac.

Avere task, operations, role, scritti per esteso in forma di testo, assegnati esplicitamente, lo preferisco davvero.

Preferenza personale. tra l’altro in questo modo, anche i permessi rbac finiscono nello storico (uso git)

Se un giorno andrò via dall’azienda, fatti loro che dovranno trovare un programmatore yii piuttosto skillato

:D :D

Buongiorno e grazie della delucidazione realtebo :slight_smile:

Ho provato a installare SRBAC ma quando clicco su login mi appare :

Error 404

Il sistema non ha potuto trovare l’azione “login” richiesta.

Devo creare io nella view user il login e il logout????

spiacente ma non conosco SRBAC, ho fatto tutto a mano io

Ma non avevi già installato Rights??? Perché anche SRBAC?

Si è vero, ma ho voluto seguire il consiglio di realtebo (che ovviamente è molto più esperto di me) e provare SRBAC. L’ ho installato e ho reso disponibile il login tramite database mysql. Ora devo capire come creare i ruoli. Infati vorrei che al modulo User potesse accedere solo chi è admin…ma devo creare il ruolo e le azioni…sto cercando di capire come fare.

Ovviamente ho eliminato i moduli Rights e Users e mi sono creato la mia tabella Utenti.

Invece a me, confrontandomi con n altro programmatore, inizia a piacere poco il fatto di mettere il nome del ruolo nel codice, figuriamoci nelle view, mi pare poco MVC-compliant.

Quindi credo che sia meglio creare delle funzioni tipo


mostraElemento()

da usare nelle view con delle ‘if’ che ritornino true o false in base ai ruoli

concordo con ettolo sulla questione di non avere hardcoded nelle view il nome del ruolo.

io tendo a creare nel controller un parametro ‘view_mode’, in basa al quale la vista determina cosa far vedere e cosa no.

così è il controller a decidere in base a vari checkaccess il comportamento della vista. Questa poi, in base alla modalità impostata, si adegua di conseguenza.