2012-05-30 10 views
5

Ich habe eine Tabelle, die meine Benutzer (user_levels) auflistet, die mit der Tabelle users (user_level_id) verknüpft sind. Level 5 ist Administrator.cakePHP isAuthorized funktioniert nicht

Ich möchte bestimmte Aktionen zu sehen eingeschränkt werden und ich kann dies mit isAuthorized tun. Ich ging nach dem Buch und ich bin mir ziemlich sicher, dass ich es richtig gemacht habe, aber es funktioniert nicht. Es erlaubt allen eingeloggten Benutzern weiterhin auf eine der Aktionen zuzugreifen, obwohl ich dies in isAuthorized leugne.

Hier ist mein Code:

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

Welches Buch folgen Sie? – Bahdeng

Antwort

6

Sieht aus wie du bist nur die Konfiguration fehlt nur noch die Auth Komponente sagen isAuthorized() zu verwenden.

'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, danke für deine Antwort, nur 1 Frage, ich verstehe immer noch nicht ganz, wie ich die Standardnutzer von bestimmten Aktionen abblocke. Als Beispiel hat mein Benutzer-Controller eine Reihe von Aktionen, und Standardbenutzer können beispielsweise auf Profile zugreifen und sich registrieren, aber Aktionen wie Hinzufügen, Bearbeiten und Löschen, die ich blockieren möchte. Wie mache ich das innerhalb der isAuthorized()? Ich weiß, ich kann nicht zulassen und verweigern, da dies nur für nicht angemeldete Benutzer gilt. – mauzilla

+0

Im Allgemeinen würden Sie ACL verwenden, um so etwas zu tun. Sie können dies jedoch immer noch mit einem benutzerdefinierten 'isAuthorized()' in jedem Controller tun und ein Array von erlaubten Aktionen pro Benutzergruppe speichern und dann dagegen prüfen. So oder so, das ist genug von einem Thema für eine neue Diskussion. – jeremyharris

+0

@jeremyharris Eine Off-Topic-Frage; Warum gibt es die Optionen "redirect" und "loginRedirect", die auf dieselbe URL verweisen? – ozanmuyes

Verwandte Themen