2012-05-29 348 views
0

我無法在CakePHP中驗證Auth組件的工作方式。我正在使用2.1cakePHP身份驗證問題

我的登錄工作正常,根據我的理解,我可以在appController中設置默認組件,如下所示。

// 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 beforeFilter() { 
    $this->Auth->allow("home"); 
    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"); 
    } 

} 

家位於/app/view/home.ctp,但是,我不能沒有被記錄在接下來訪問的網頁我有2個不同的用戶級別,正常和管理員。如果您是管理員或非管理員,我想限制控制器中的某些操作。

在我UserController中我有例如:

public function beforeFilter() { 
    parent::beforeFilter(); 
    $this->Auth->allow("login"); 
    if($this->Auth->user("user_type_id") != 5) { 
     $this->Auth->allow("login","profile"); 
    } 
} 

但不論用戶類型的,每個人都可以查看的行動。

在我的網頁控制器我也有以下幾點:

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

但我必須先登錄才能查看任何網頁。

我確信自己做錯了什麼,但是我無法將自己的頭圍繞在什麼幫助下?

+0

app/view/home.ctp?你的意思是app/view/pages/home.ctp? – tigrang

回答

1

首先,home不是控制器上的操作,所以$this->Auth->allow("home");不會產生影響。 $this->Auth->allow("display");會,但會允許所有頁面被看到(不知道如果這是有意的)。

其次,您使用的$this->Auth->allow("*");後您調用父類的beforeFilter,這意味着AppController::beforeFilter()將會把它當作如果用戶沒有登錄,因爲它不知道你在事後已經允許什麼。

+0

這看起來像原因,通過'$ this-> allowedActions == array('*')|| auth通過beforeFilter檢查isAllowed。 in_array($ action,array_map('strtolower',$ allowedActions))'在這種情況下,既不是'$ allowedActions'看起來像'array('home','*')'我猜想。 – tigrang

+0

@Jeremy:謝謝,這解決了我的頁面問題。我改變了appcontroller中的$ this-> Auth-> allow(「display」),它像魅力一樣顯示所有頁面。但是,我仍然發現,在我的用戶控制器(如上)中,即使使用了if語句,我也無法阻止普通用戶訪問添加頁面,即使我使用拒絕(「add」) – mauzilla

+0

這是因爲Auth-> allow has在用戶登錄後不會有任何影響。最簡單的方法是將Auth設置爲authroize Controller並實現isAuthorized()方法。請參閱本書中的示例。 – tigrang