2013-08-29 112 views
2

我正在添加一些修改到我的應用程序,以便在我的MY_Controller上檢查是否允許用戶訪問當前頁面。這是我的一個控制器的例子。我所有的人都有閱讀,編輯,創建,刪除功能。我只需要弄清楚如何全局設置權限來允許或禁止用戶訪問它的函數,而不是在每個函數上執行if語句。如何設置用戶角色和權限?

<?php 

if (!defined('BASEPATH')) 
    exit('No direct script access allowed'); 

class Content_pages extends MY_Controller 
{ 
    /** 
    * Account::__construct() 
    * 
    * Load the parent construct and any additional models, helper, libraries available. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('content_page_model', 'content_page'); 
    } 

    /** 
    * Content_pages::read() 
    * 
    * @return 
    */ 
    public function read() 
    {  
     //vardump($this->user_data); 
     // Checks to see if the user has a role id of four and if they do then it shows the admin dashboard and if not then shows the user dashboard. 
     if ($this->user_data->access_level_id >= 4) 
     { 
      // Retrieve all the users from the database that handle characters and assign it to the users variable. 
      $content_pages = $this->content_page->get_all(); 

      // Place to dump the users array to verify it is the expected value. 
      // vardump($users); 

      // Checks to verify that there is data inside of the users array and that it is not empty. 
      if (!empty($content_pages)) 
      { 
       $this->template->set('content_pages', $content_pages); 
      } 

      // Add the breadcrumbs to the view. 
      $this->breadcrumb->add_crumb('<li><a href="' . base_url() . 'wrestling-manager/control-panel" class="glyphicons home"><i></i> Control Panel</a></li>'); 
      $this->breadcrumb->add_crumb('<li><i></i> Content Pages</li>'); 
      $this->breadcrumb->change_link('<li class="divider"></li>'); 

      // Sets all the properites for the template view. 
      $this->template 
       ->set_theme('smashing') 
       ->set_layout('control_panel_view') 
       ->set_partial('header', 'partials/header') 
       ->set_partial('sidebar','partials/sidebar') 
       ->set_partial('footer', 'partials/footer') 
       ->title('Content Pages') 
       ->set('user_data', $this->user_data) 
       ->build('content_pages_view');  
     } 
     else 
     { 
      echo 'haha'; 
      //redirect('wrestling-manager/control-panel'); 
     } 
    } 

    /** 
    * Content_pages::edit() 
    * 
    * @return void 
    */ 
    public function create() 
    { 
     echo 'testing for create function'; 
    } 

    /** 
    * Content_pages::edit() 
    * 
    * @return void 
    */ 
    public function edit($content_page_id) 
    { 
     vardump($content_page_id); 
    } 

    public function delete($content_page_id) 
    { 
     vardump($content_page_id); 
    } 

    /** 
    * Content_pages::save() 
    * 
    * @return 
    */ 
    public function save() 
    { 
     echo 'testing for save function'; 
    } 

    /** 
    * Content_pages::update() 
    * 
    * @return 
    */ 
    public function update() 
    { 
     echo 'testing for update function'; 
    } 
} 

回答

1

您可以在配置文件或數據庫中設置您的權限。

有了權限檢查,在調用任何控制器之前,最好使用攔截器/過濾器。

對於控制器,我不得不說你做的有點不對,因爲他們通常不打算執行CRUD操作,而是在更高層次上進行特定領域的操作(或者在較低級別的情況下,一種常見的方法)。

  • 有一個角色列表和權限列表。 (例如GUEST,USER,ADMIN角色;權限是特定於域的)
  • 根據您的需要將權限與權限關聯。
  • 將每個用戶分配一個角色

然後你就可以通過AuthorizationService,檢查當前用戶是否允許做某件事,或者不是。例如,該服務可以迭代給定操作需要的所有權限,以驗證當前用戶的角色是否具有這些權限;例如:

class AuthorizationFilter { 

    public function verifyAccess($user, $request) { 
     $role = $user->getRole(); 
     $permissions = $authorization->getPermissionsFor($request); 
     $allowed = true; // true as a missing permission will later set it to false 
     for ($i = 0; $i < size($permissions); $i++) { 
      $allowed &= $role->hasPermission($permissions[$i]); 
     } 
     return $allowed; 
    } 
} 

之後,可以調用控制器,用於原始請求或基於授權的結果的「回退」之一,例如:

class RequestDispatcher { 

    public function dispatch() { 
     // ... 
     if ($authFilter->verifyAccess($user, $request)) { 
      // invoke proper request controller 
     } else { 
      // invoke "you're not allowed to do this" controller 
     } 
     // ... 
    } 
} 

警告:上述代碼僅是示例代碼,絕不意味着完整或適合於生產環境!

+0

這是什麼發生在這個鏈接? https://github.com/EllisLab/CodeIgniter/wiki/Permission-Class – user2576961

+0

@ user2576961上帝,我討厭CodeIgniter :)嗯,它是類似的東西。如果仔細查看鏈接的代碼,您可以在每個方法的上方看到每種方法的摘要。顯示的解決方案非常醜陋,不專業,但概念是相同的。您在服務之前攔截請求並首先詢問訪問控制設施,以決定是允許還是不允許用戶請求的操作。舉例來說,它在控制器內部執行。我會推薦它(和一般的CI),但它會成爲你品味的問題。 – Powerslave

+0

夠公平的。我感謝您的建議和意見。 – user2576961

1

嗯,這就是MY_Controller是一回事 - 你必須讓所有的檢查有 - 有創造的功能,並呼籲他們在構造函數中,根據URL和/或GET/POST /會話參數。如果用戶沒有權限訪問它,只需在SESSION中添加一些標誌或錯誤文本。然後在你的主控制器中只檢查那個SESSION標誌。

+0

所以我必須爲我的控制器內部的所有30+控制器做到這一點? – user2576961

+0

另一種選擇是從MY_Controller重定向到某個錯誤頁面(或者帶有錯誤的加載視圖),然後退出; –

+0

我做了一些搜索,並找到了一些使用ACL作爲用戶角色權限的庫。例如這個。 https://github.com/EllisLab/CodeIgniter/wiki/Permission-Class – user2576961