2011-10-08 33 views
0

我有以下isAuthorized()在我的學生控制器功能:CakePHP的驗證組件 - isAuthorized()函數問題

function isAuthorized() { 
    $studentId = $this->Auth->user('id'); 
    $studentEmail = $this->Auth->user('email'); 
    if ($this->Auth->user('active') == 1 && $this->Auth->user('level_complete') != 1) { 
     $this->Auth->loginRedirect = '/classrooms/view'; 
     return true; 
    } elseif (!$this->Student->hasPayed($studentId)) { 
     $this->Session->write('Payment.student_id', $studentId); 
     $this->Session->write('Payment.student_email', $studentEmail); 
     $this->Session->write('Payment.examScore', $this->Student->getPlacementScore($studentId)); 
     $this->Auth->logout(); 
     $this->redirect(array('controller'=>'payments', 'action'=>'pay')); 
    } elseif ($this->Auth->user('level_complete') == 1) { 
     $this->Session->write('Payment.student_id', $studentId); 
     $this->Session->write('Payment.student_email', $studentEmail); 
     $this->Auth->logout(); 
     $this->redirect(array('controller' => 'payments', 'action' => 'repay')); 
    } else { 
     $this->Auth->logout(); 
     $this->redirect(array('controller' => 'students', 'action' => 'disabled')); 
    } 


    return false; 
} 

基本上有涵蓋在這個方法中四種狀態:

  1. 用戶處於活動狀態並且尚未完成某個級別=已授權
  2. 用戶未付款=未授權
  3. 用戶已完成級別並且必須再次付款=不是授權
  4. 用戶帳戶是不活躍

我遇到的問題是,我有我的頭一個登錄表單,我可以從任何控制器登錄。如果我從學生控制器以外的控制器登錄,則不會調用isAuthorized()方法,即使用戶不應該也可以登錄。

任何想法?


編輯:檢查isAuthorized()方法的API的定義之後,我想,當被要求從學生控制器操作的方法只調用。那麼我還能在哪裏實現這個邏輯呢?謝謝

+0

你是否在使用'beforeFilter()'? –

+0

耶是在beforeFilter()中設置Auth組件,但不是這個邏輯。我儘管當用戶嘗試登錄時調用了isAuthorized()方法。 – AlexBrand

+0

您在每個控制器中都有登錄操作? –

回答

1

我通常在我的驗證控制器(即UsersController)的login()方法中放入這樣的邏輯。

但是,我不認爲你對isAuthorized()的理解是不正確的。不幸的是,我確實相信這是更難以連線。

例如:

  • 正如注意到santiagobasulto,你需要確保你已經配置Auth->authorize = 'controller'
  • 如果您正在使用任何beforeFilters()請確保您撥打parent::beforeFilter()。您可能已經在一個關鍵區域忘記了這一點,使Cake不會在其他登錄操作中發揮作用。
+0

你如何在login()方法中實現這一點?您可以使用$ this-> data中的值通過電子郵件地址查找用戶。謝謝 – AlexBrand

+1

當然。或者你可以先調用'Auth-> login()',使用上面的確切代碼。這真的取決於你在*登錄之前或之後做這件事。但是,*登錄後*往往更有意義,因爲你已經確保你有一個有效的用戶。 –

5

你搞砸了。當用戶登錄的isAuthorized()方法僅稱爲

這意味着餅兩個部分邏輯分離:

1)用戶必須登錄到看到訪問動作與$this->Auth->allow()控制方法(在你的控制器的beforeFilter中)。這告訴蛋糕用戶是否必須登錄才能看到動作。

2)用戶必須通過isAuthorized()方法。只有當$ this-> Auth-> authorize被設置爲「controller」時。

所以,如果你想用戶必須登錄到從控制器C訪問行動「X」,在C控制器,你必須把這個代碼:

function beforeFilter(){ 
    $this->Auth->authorize = 'controller'; 
    $this->Auth->allow('*'); 
} 

之後,如果你想有更多的控制權(例如,如果用戶角色是「admin」),那麼你必須在你的isAuthorized()方法中做到這一點。

希望它有幫助。

+0

這不是我正在尋找的。我需要測試與用戶關聯的特定條件,例如,如果用戶未提交付款,則應在嘗試登錄後將其重定向到付款頁面。 – AlexBrand

+0

然後你必須改變你的登錄方法!你必須行事不同。不要讓他登錄。 – santiagobasulto

+0

我應該編寫自己的登錄()函數,是否包含所有這些邏輯,然後在他被授權的情況下手動登錄他? – AlexBrand