2012-05-30 15 views
5

Tengo una tabla que divide mis usuarios (user_levels) vinculados a la tabla de usuarios (user_level_id). El nivel 5 es administrador.cakePHP isAuthorized no funciona

Quiero limitar que se vean ciertas acciones y entiendo que puedo hacer esto con isAuthorized. Fui según el libro y estoy bastante seguro de que lo tengo bien, pero no está funcionando. Permite a los usuarios que hayan iniciado sesión seguir accediendo a cualquiera de las acciones aunque lo niegue en isAuthorized.

Aquí está mi código:

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

¿Qué libro estás siguiendo? – Bahdeng

Respuesta

6

Parece que eres sólo falta la configuración sólo decirle a la AuthComponent utilizar 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, gracias por su respuesta, solo 1 pregunta, todavía no entiendo muy bien cómo digo bloquear a los usuarios estándar de acciones específicas. Como ejemplo, mi controlador de usuario tiene una serie de acciones, y los usuarios estándar pueden, por ejemplo, acceder a un perfil y registrarse, pero me gustaría bloquear acciones como agregar, editar y eliminar. ¿Cómo hago esto dentro de isAuthorized()? Sé que no puedo usar permitir y denegar, ya que solo se aplica a usuarios que no han iniciado sesión. – mauzilla

+0

En general, usaría ACL para hacer algo como eso. Sin embargo, puede hacer esto con un 'isAuthorized()' personalizado en cada controlador y almacenar una matriz de acciones permitidas por grupo de usuarios, luego verifique eso. De cualquier manera, ese es un tema suficiente para una nueva discusión. – jeremyharris

+0

@jeremyharris Una pregunta fuera del tema; ¿Por qué existen opciones de "redireccionamiento" y "loginRedirect" y señala la misma URL? – ozanmuyes