2012-05-30 28 views
5

Ho una tabella che divide i miei utenti (user_levels) collegati alla tabella degli utenti (user_level_id). Il livello 5 è amministratore.cakePHP isAuthorized not working

Voglio limitare alcune azioni dall'essere visualizzato e capire che posso farlo con isAuthorized. Sono andato secondo il libro e sono abbastanza sicuro di averlo ragione, ma non funziona. Permette a tutti gli utenti registrati di accedere comunque a qualsiasi azione, sebbene io lo neghi in IsAuthorized.

Ecco il mio codice:

App Controller:public $components = array(
    'Session', 

    'Auth' => array(
     'loginAction' => array(
      'controller' => 'users', 
      'action' => 'login', 
     ), 
     'authError' => "Your username and password is incorrect, please try again.", 
     'authenticate' => array(
      'Form' => array(
       'scope' => array('User.user_status_id' => 1) 
      ) 
     ), 
     'redirect' => array("controller" => "users", "action" => "profile"), 
     'loginRedirect' => array("controller" => "users", "action" => "profile") 
    ) 
); 

public function isAuthorized($user = null) { 
    if($this->Auth->user("user_level_id") == 5) { 
     return true; 
    } 
    // Default deny 
    return false; 
} 

public function beforeFilter() { 
    $this->Auth->allow("display"); 
    if($this->Auth->loggedIn() == true) { 
     $this->set("user_name",$this->Auth->user("first_name")." ".$this->Auth->user("last_name")); 
     $this->set("loggedIn",true); 
     if($this->Auth->user("user_type_id") == 5) { 
      $this->set("navigation","navigation_admin"); 
     } else { 
      $this->set("navigation","navigation_loggedin"); 
     } 
    } else { 
     $this->set("loggedIn",false); 
     $this->set("navigation","navigation_notloggedin"); 
    } 

} 

} 

// Users Controller: 

public function beforeFilter() { 
    $this->Auth->allow("login"); 
    parent::beforeFilter(); 
} 

public function isAuthorized($user = null) { 
    if($this->Auth->user("user_level_id") == 5) { 

     return true; 
    } 
    // Default deny 
    return parent::isAuthorized($user); 
} 
+0

che libro stai seguendo? – Bahdeng

risposta

6

sembra che stai manca solo la configurazione di dire solo l'AuthComponent da utilizzare isAuthorized().

'Auth' => array(
     'loginAction' => array(
      'controller' => 'users', 
      'action' => 'login', 
     ), 
     'authError' => "Your username and password is incorrect, please try again.", 
     'authenticate' => array(
      'Form' => array(
       'scope' => array('User.user_status_id' => 1) 
      ) 
     ), 
     'authorize' => array('Controller'), // <- here 
     'redirect' => array("controller" => "users", "action" => "profile"), 
     'loginRedirect' => array("controller" => "users", "action" => "profile") 
    ) 
+0

hey jeremy, grazie per la tua risposta, solo 1 domanda, ancora non capisco come blocco gli utenti standard da azioni specifiche. Ad esempio, il controller dei miei utenti ha un numero di azioni e gli utenti standard possono esempio accedere al profilo e registrarsi, ma azioni come aggiungere, modificare ed eliminare vorrei bloccate. Come posso farlo all'interno di isAuthorized()? So che non posso usare consentire e negare in quanto è applicabile solo agli utenti non registrati. – mauzilla

+0

Generalmente useresti ACL per fare qualcosa del genere. Tuttavia, puoi ancora farlo con un custom 'isAuthorized()' in ogni controller e memorizzare un array di azioni consentite per gruppo di utenti, quindi confrontalo. Ad ogni modo, è sufficiente un argomento per una nuova discussione. – jeremyharris

+0

@jeremyharris Una domanda fuori tema; perché ci sono opzioni di "reindirizzamento" e "loginRedirect" esistenti e che indicano lo stesso URL? – ozanmuyes