2016-11-14 125 views
1

我想在笨使用_remap方法來創建一個全球性的認證。下面是用於訪問控制器/方法的網站的條件:有什麼方法可以簡化codeigniter中的全局認證?

  1. 方法必須存在。
  2. 某些控制器只能在用戶/管理員登錄時才能訪問。
  3. 某些控制器只能由管理員訪問。

_remap方法寫在MY_Controller中,它將繼承到所有控制器。這裏是我的代碼:

protected $must_login; 
protected $must_admin; 

public function _remap($method, $param = array()) 
{ 
    # Check if method exist 
    if (method_exists($this, $method)) 
    { 
    # Check whether the user has to be login to access it 
    if ($this->must_login) 
    { 
     # Check whether the user has logged in 
     if ($this->auth->is_loggedin()) 
     { 
     # Check whether it has to be admin to access it 
     if ($this->must_admin) 
     { 
      # Check whether it is admin 
      if ($this->auth->is_admin()) 
      { 
      # Run the method 
      return call_user_func_array(array($this, $method), $param); 
      } 
      else 
      { 
      # Redirecting to login form 
      $this->go('auth'); 
      } 
     } 
     else 
     { 
      return call_user_func_array(array($this, $method), $param); 
     } 
     } 
     else 
     { 
     $this->go('auth'); 
     } 
    } 
    else 
    { 
     return call_user_func_array(array($this, $method), $param); 
    } 
    } 
    else 
    { 
    $this->go('auth'); 
    } 
} 

代碼工作,但我覺得它可以簡化。我嘗試過,但總是以無限重定向結束。有什麼方法可以簡單地使用這種方法嗎?

預先感謝您。

+2

我認爲這將是很容易通過擴展是CI_Controller來實現。在這裏的例子無處不在,並在網上如何做到這一點。 CI已檢查有效的控制器和控制器/方法,如果未找到,將會出現錯誤404。你可以利用'$ route ['404_override']'完成等同於'$ this-> go('auth');'當CI已經有一個完全可以接受的'router'時,爲什麼創建一個'go'類深思熟慮?如果你只是利用現有的框架結構,這將會更加簡化。 – DFriend

+0

我同意,我認爲,儘管它可行,但整個方法並不是最可靠,穩健或可維護的方法,以實現實際上相對微不足道的事情 - 在調用特定控制器時,用戶是否允許訪問。這種認證可以在一條線上實現,更重要的是,這種認證的操作可以以更透明的方式進行調整。恕我直言,這是重映射功能的過度使用,完全沒有必要。再次,恕我直言,重映射是邊緣情況和情景,解決方法和fudges的後備。我個人會避免使用它。 – PaulD

回答

0

我的偏好通常是把檢查權在構造函數,然後再返回用戶或管理員用$這個 - >

function __construct() 
{ 

    parent::__construct(); 

    if (!$this->user = $this->users->returnUser()) 
    { 
     redirect("userlogin"); 
    } 

} 

然後$這個 - >用戶現在可用於一切,你的控制器電話 - 模型和視圖:

echo 'Hello ' . $this->user->first_name . ' ' . $this->user->last_name ; 

因此然後讓說,你有管理員和超級管理員。您不必檢查 - 此管理員是否可以訪問此控制器?你可以使用單獨的支票在每個控制器構造:

if (!$this->admin = $this->admins->returnAdmin()) 
    { 
     redirect("adminlogin"); 
    } 

// Or 
    if (!$this->superAdmin = $this->superadmins->returnSuperAdmin()) 
    { 
     redirect("superadminlogin"); 
    } 

這也清晰地分離出來,你將會重定向到這樣他們就可以去到正確的登錄頁面。最後,當您查看控制器代碼時,它會提供一個快速提醒 - 在頁面頂部,您將立即知道哪種用戶應該可以訪問它。需要考慮的事項 - 會強烈建議您不要在視圖文件中檢查登錄或管理狀態。創建更多視圖文件更安全。您的視圖文件不應該有責任確定是否有人登錄。因此,基本上一旦確定了構造函數中的查看者狀態是什麼 - 就是這樣,在下一次控制器調用之前不需要再次檢查。

+0

謝謝你,這種方法更可靠... –

+0

高興它幫助!此外,如果您可以請點擊勾選'接受此答案',那麼它將關閉此線程。 – cartalot

相關問題