2013-07-30 189 views
3

我在查找應用程序中的API用戶身份驗證方法時遇到問題。我開始着手構建一個系統,用戶可以通過Web訪問和驗證身份,但需求發生了變化,我需要實施一些額外的操作,這些操作可以使用POST API調用以RESTful方式提供。Yii RESTful身份驗證

我創建了一個擴展CBehaviour的類,並強制重定向到所有未經身份驗證的用戶的登錄頁面(found on the yii framework forum here)。問題在於所有的API調用都是通過相同的邏輯強制的,任何POST請求都只是將HTML吐出到登錄頁面。

class ApplicationBehavior extends CBehavior { 
    private $_owner; 

    public function events() { 
     return array(
      'onBeginRequest' => 'forceGuestLogin', 
     ); 
    } 

    public function forceGuestLogin() { 
     $owner = $this->getOwner(); 
     if ($owner->user->getIsGuest()) 
      $owner->catchAllRequest = array("site/login"); 
    } 
} 

我該如何去分離API用戶和Web用戶的認證?

回答

3

我會遵循這個guide在Yii中創建一個REST API。在修改了配置urlManager條目之後,您的所有API請求都將使用API​​Controller。然後,您可以將您的APIController返回任何的控制器的beforeAction下面的代碼,如果用戶是來賓(或錯誤信息)

protected function beforeAction($event) { 
    if (Yii::app()->user->isGuest) { 
     echo "Invalid credentials"; 
     Yii::app()->end(); 
    } 
} 

注:以上爲我的目的作品中的代碼,因爲所有的REST請求發送通過相同的瀏覽器。 (已登錄並且具有登錄cookie)

如果您用位於protected/controllers中的新基本控制器替換該行爲以強制登錄,它將僅適用於需要登錄而不是APIController的頁面。這裏是我的一個例子:

//Make sure all Controllers which require a login inherit from this 
class ControllerLoginRequired extends CController { 
    public function runAction($action) { 
     if (Yii::app()->user->isGuest && 'site' != $this->route) { 
      Yii::app()->user->returnUrl = $this->route; 
      parent::redirect(array('site/login')); 
     } else { 
      parent::runAction($action); 
     } 
    } 
} 

所有解釋的都可以通過用戶登錄到Yii的同一個瀏覽器對REST請求起作用。如果您需要將您的REST服務公開給不是瀏覽器登錄到Yii的客戶,我相信您將不得不提供一個自定義的身份驗證/令牌方案。

+0

是的我已經從那個教程中收集了一些代碼,它幾乎是唯一解釋Yii中的REST API的方法,並且每個人都引用了它。問題仍然是,我強制訪客登錄的CBehavior的擴展將覆蓋此API控制器中的任何內容,因爲它在它之前執行。 –

+1

而不是使用行爲重定向到登錄我使用LoginRequiredController由所有需要登錄的控制器繼承。如果你這樣做,至少可以解決這個問題。用於REST的APIController不會從那個繼承。 – Mikt25

+0

優秀!這是完美的。如果您可以更新您的答案,我會將其標記爲已接受。 –