2014-03-03 52 views
0

我是Yii的新手。我在驗證不同位置時遇到問題。我有一個需要管理員和用戶身份驗證的應用程序。雖然管理員使用谷歌身份驗證,用戶使用事實上的用戶名/密碼組合。Yii認證

以下是我的代碼。我錯過了什麼。基本上,我想當用戶輸入/管理她/她應該得到管理登錄 - 我已經排序,當他/她鍵入/帳戶/登錄用戶應該得到正規的用戶名/密碼登錄。

public function beforeAction($action) 
{ 


    $host = $_SERVER ['REQUEST_URI']; 
    if (!isset(Yii::app()->session['user_type'])) 
    { 
     if ($host != '/account/login' && $host != '/admin') 
     { 
      //header('Location: /access'); 
      header('Location: /account/login'); 
     } 
     /*else if ($host != '/admin') 
     { 
      header('Location: /admin'); 
     }*/ 

    } 
    else 
    { 
     $access = $this->access(); 
     $currentCont = ucfirst($this->getUniqueId()); 
     if (!empty($access)) 
     { 
      if (!in_array($currentCont, $access)) 
      { 
       Yii::app()->session->clear(); 
       Yii::app()->session->destroy(); 
       header('Location: /account/login'); 
      } 
     } 
     return parent::beforeAction($action); 
    } 


    return parent::beforeAction($action); 
} 
+0

那麼是什麼問題? –

+0

嗨Mihai,打字/管理應該留在那裏不要重定向到/帳戶/登錄這是一般用戶登錄和/管理員有登錄管理..謝謝。 – Cyberomin

+0

這可能對你有所幫助:https://www.cloudways.com/blog/user-authentication-yii2/ –

回答

0

我相信.htaccess可能會將您的請求從1轉換爲另一個。

即使您的網址可能是/ admin,它也可能會翻譯成其他的.htaccess文件,而這實際上是您的URI。

如果不是這樣,我很累,現在:(

+0

只需簡單地調試一下$ host的值是什麼,那會讓你走上正確的軌道。 –

+0

謝謝Mihai,我很感激。 – Cyberomin

+0

我想我明白了:)。標題('Location:/ account/login');應該跟着出口。 YOu在不停止應用程序的情況下進行重定向。看到這裏http://au2.php.net/manual/en/function.header.php –

0

我發現這個問題不那麼優雅的解決方案:

if ($currentCont != 'admin' && $host != 'login') 
{ 
    echo '<meta http-equiv="refresh" content="0; url='.Yii::app()->createUrl('/account/login').'">'; 

} 
else 
{ 
    echo '<meta http-equiv="refresh" content="0;url='.Yii::app()->createUrl('/admin').'">'; 

} 
0

這令我奇怪的,你會用beforeAction做這個如果我瞭解你的需要,我會寫兩個動作,一個是網站/登錄,會處理普通用戶,一個是網站/管理員,並且會處理你的管理員用戶。對於您的普通用戶:

public function actionLogin() 
{ 
    if (!\Yii::$app->user->isGuest) { 
     return $this->goHome(); 
    } 

    $model = new LoginForm(); 
    if ($model->load(Yii::$app->request->post()) && $model->login()) { 
     return $this->goBack(); 
    } else { 
     return $this->render('login', [ 
      'model' => $model, 
     ]); 
    } 
} 

然後我會爲管理案例做第二個操作。

public function actionAdmin() 
{ 
    if (!\Yii::$app->user->isGuest) { 
     return $this->goHome(); 
    } 

    <do google auth stuff> 
    if (<authenticated by google>) { 
     return $this->goBack(); 
    } else { 
     <deal with authentication failure> 
    } 
}