2012-05-30 28 views
5

Tôi có một bảng chia tách người dùng của tôi (user_levels) được liên kết với bảng người dùng (user_level_id). Cấp 5 là quản trị viên.cakePHP isAuthorized không hoạt động

Tôi muốn giới hạn một số hành động nhất định không được xem và hiểu rằng tôi có thể thực hiện việc này với isAuthorized. Tôi đã đi theo cuốn sách và tôi khá chắc chắn rằng tôi có nó đúng, nhưng nó không hoạt động. Nó cho phép bất kỳ người dùng đăng nhập nào vẫn truy cập bất kỳ hành động nào mặc dù tôi từ chối nó trong isAuthorized.

Đây là mã của tôi:

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

bạn đang theo dõi sách nào? – Bahdeng

Trả lời

6

Dường như bạn đang chỉ thiếu cấu hình để chỉ nói với các AuthComponent sử dụng 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, cảm ơn bạn đã trả lời của bạn, chỉ cần 1 câu hỏi, tôi vẫn không hoàn toàn hiểu làm thế nào tôi chặn nói người dùng chuẩn từ hành động cụ thể. Ví dụ, bộ điều khiển người dùng của tôi có một số hành động và người dùng chuẩn có thể truy cập hồ sơ và đăng ký, nhưng các hành động như thêm, chỉnh sửa và xóa tôi muốn bị chặn. Làm thế nào để làm điều này trong isAuthorized()? Tôi biết tôi không thể sử dụng cho phép và từ chối vì điều đó chỉ áp dụng cho người dùng không đăng nhập. – mauzilla

+0

Nói chung bạn sẽ sử dụng ACL để làm một cái gì đó như thế. Tuy nhiên, bạn vẫn có thể làm điều này với một 'isAuthorized()' tùy chỉnh trong mỗi bộ điều khiển và lưu trữ một mảng các hành động được phép cho mỗi nhóm người dùng, sau đó kiểm tra lại điều đó. Dù bằng cách nào, đó là đủ của một chủ đề cho một cuộc thảo luận mới. – jeremyharris

+0

@jeremyharris Một câu hỏi ngoài chủ đề; tại sao có các tùy chọn "chuyển hướng" và "loginRedirect" hiện tại và chỉ ra cùng một URL? – ozanmuyes

Các vấn đề liên quan