2012-12-11 12 views
5

Ho un problema con l'integrazione BjyAuthorize e la navigazione Zend e non so come risolverli. Provo questo manual e tutto funziona bene. Ma mi aspettavo quando definisco le guardie in bjyauthorize.config e dopo questo, ci sarà un riflesso tra la mia configurazione di navigazione e di guardia (i controller negati o le rotte non visualizzano gli elementi di navigazione). Il mio problema è che gli elementi di navigazione sono ancora visualizzati, ma le sezioni sono protette correttamente. C'è un modo, come riflettere le guardie nella navigazione? My view helper config nella Module.phpZF2 Integrazione di BjyAuthorize con Zend Navigation

La mia applicazione di configurazione view helper/Module.php:

'mainMenu' => function($sm){ 
       $nav = $sm->get('navigation')->menu(); 
       $serviceLocator = $sm->getServiceLocator(); 
       $acl = $serviceLocator->get('BjyAuthorize\Service\Authorize')->getAcl(); 
       $role = $serviceLocator->get('BjyAuthorize\Service\Authorize')->getIdentity(); 
       $nav->setAcl($acl); 
       $nav->setRole($role); // Todo replace 
       $nav->setUseAcl(); 
       return $nav->setUlClass('nav')->setTranslatorTextDomain(__NAMESPACE__); 
      } 

La mia configurazione guardia bjyauthorize.global.php

'guards' => array(
    'BjyAuthorize\Guard\Controller' => array(
     array('controller' => 'Article\Controller\Article', 'roles' => array('user')), 
), 

And My navigazione. global.php

return array(
    'navigation' => array(
     'default' => array(
      'articles' => array(
       'label' => 'Articles', 
       'route' => 'articles', 
      ), 
     ), 
    )); 

Provo a cambiare percorso confi guration al modulo/controller/azione e ancora non funziona.

risposta

5

Non è stata specificata la risorsa all'interno della configurazione di navigazione. Assicurarsi inoltre se $ ruolo corrisponde bjyauthorize identità

'navigation' => array(
    'default' => array(
    array(
     'label' => 'Registration', 
    'resource' => 'controller/cebEvent.registrationController:add', 
    'route' => 'registration/add', 
    ), 
), 
), 

La risorsa specificata deve corrispondere alla configurazione guardia:

'guards' => array(
    'BjyAuthorize\Guard\Controller' => array(
     array('controller' => 'cebEvent.registrationController','action' => 'add', 'roles' => array('guest','registration_manage')), 
    ), 
), 
+0

Grazie per il consiglio, hai ragione. Il problema era in I non specificare la risorsa. – user1893983

0

Puoi pubblicare un esempio di utilizzo per uso Guardia \ percorso invece di controller? Il mio esempio percorso per questo caso:

'guards' => array(
    'BjyAuthorize\Guard\Route' => array(
     array('route' => 'zfcadmin/sap-targetvalue/index', 'roles' => array('guest', 'user')), 
     array('route' => 'zfcadmin/sap-targetvalue/create', 'roles' => array('user')), 
    ) 
); 
6

per aiutare qualcuno che sta tentando questa operazione utilizzando BjyAuthorize \ Guardia \ percorso ...

Sarà necessario anteporre il nome del percorso con route/ e l'uso che per la valore delle risorse.

Se la configurazione ha una guardia come questo ...

'guards' => array(
    'BjyAuthorize\Guard\Route' => array(
     array('route' => 'zfcadmin/zfcuseradmin/list', 'roles' => array('admin')), 
    ) 
); 

definirebbe qualcosa di simile per la navigazione

'navigation' => array(
    'default' => array(
     'admin' => array(
      'label' => 'Admin', 
      'route' => 'zfcadmin', 
      'pages' => array(
       'users' => array(
        'resource' => 'route/zfcadmin/zfcuseradmin/list', // route resource ;) 
        'label' => 'Users', 
        'route' => 'zfcadmin/zfcuseradmin/list', 
       ), 
      ), 
     ), 
    ), 
), 

È possibile impostare l'ACL di default e il ruolo mettendo in questo il tuo metodo onBootstrap del tuo modulo.

$sm = $e->getApplication()->getServiceManager(); 
$auth = $sm->get('BjyAuthorize\Service\Authorize'); 

$acl = $auth->getAcl(); 
$role = $auth->getIdentity(); 
\Zend\View\Helper\Navigation::setDefaultAcl($acl); 
\Zend\View\Helper\Navigation::setDefaultRole($role); 

Spero che questo aiuti qualcuno là fuori.

+0

Ciao, funziona abbastanza bene. Ma come si controlla se un utente è autenticato o no? Il metodo hasIdentity() non esiste ... – cwhisperer

+0

@cwhisperer BjyAuthorize è per [autenticazione NON autenticata] (http://stackoverflow.com/questions/6556522/authentication-versus-authorization). Il [Modulo ZfcUser] (https://github.com/ZF-Commons/ZfcUser) fa uso di 'Zend \ Authentication \ AuthenticationService' che ha il metodo' hasIdentity() 'che stai cercando. – moranjk

+0

Hai ragione, thx ... Un'altra domanda in questo contesto: In una vista posso usare $ this-> isAllowed ('route/xyz'), come posso usare l'helper isAllowed() in una vista Helper? – cwhisperer

0

Come menzionato da Griesi, è sufficiente specificare la risorsa nella configurazione di navigazione.

Nel suo esempio ha dichiarato questo controller & azione come risorsa

regolatore/cebEvent.registrationController: aggiungere

Voglio solo aggiungere che questa versione funziona anche (in questo caso senza l'azione)

'risorse' => 'regolatore/gioco \ Controller \ List'

Forse è utile per qualcuno. Ho pensato che non funzionerà mai perché sembra così terribilmente sbagliato;)

Problemi correlati