簡體   English   中英

角色權限和導航

[英]Roles Permissions and Navigation

我一直想知道執行以下操作的最有效方法是什么:

我有一個包含不同類型用戶的 CMS。 所有用戶都可以訪問相同的 CMS,但是側邊欄(導航)中的鏈接將由用戶有權訪問的內容組成。

我想弄清楚我應該如何把它放在一起。 我有一個Admin_Controller可能有助於將邏輯放入其中,但需要一些幫助來弄清楚如何這樣做。

為了進一步解釋我想要什么,我設置了以下用戶表和導航。 假設第一個用戶 (1) 是訪客,因此他們可能只能查看儀表板,而不能作為該角色查看其他任何內容。 也許角色為 2 的用戶可以查看儀表板和另外 2 個菜單。 管理員可以訪問所有菜單。 還需要考慮的是,如果假設用戶只能訪問菜單 2 下的三個鏈接中的兩個,該怎么辦。

這是我正在談論的一個例子。

用戶表

user_id   username    status_id    role_id
-------------------------------------------
1         testuser1   1 (active)   1 (guest)
2         testuser2   1            2 (user)
3         testuser3   1            3 (editor)
4         testuser4   1            4 (admin)

導航

<ul>
    <li class="current">
    <a class="current" href="<?php echo base_url(); ?>dashboard" data-toggle="tooltip" data-placement="right" title="" data-original-title="Dashboard"> <i class="fa fa-home"></i> </a>
    </li>
    <li>
        <a href="#" data-toggle="tooltip" data-placement="right" title="" data-original-title="Menu 1"> <i class="fa fa-user"></i> </a>
        <ul>
            <li><a>Test Link 1</a></li>
            <li><a>Test Link 2</a></li>
            <li><a>Test Link 3</a></li>
        </ul>                
    </li>
    <li>
        <a href="#" data-toggle="tooltip" data-placement="right" title="" data-original-title="Menu 2"> <i class="fa fa-pencil"></i> </a>
        <ul>
            <li><a>Test Link 1</a></li>
            <li><a>Test Link 2</a></li>
            <li><a>Test Link 3</a></li>
        </ul>   
    </li>
    <li>
        <a href="#" data-toggle="tooltip" data-placement="right" title="" data-original-title="Menu 3"> <i class="fa fa-calendar"></i> </a>
        <ul>
            <li><a>Test Link 1</a></li>
            <li><a>Test Link 2</a></li>
            <li><a>Test Link 3</a></li>
        </ul>   
    </li>
    <li>
        <a href="#" data-toggle="tooltip" data-placement="right" title="" data-original-title="Menu 4"> <i class="fa fa-users"></i> </a>
    </li>
    <li>
        <a href="#" data-toggle="tooltip" data-placement="right" title="" data-original-title="Menu 5"> <i class="fa fa-briefcase"></i> </a>
    </li>
    <li>
        <a href="#" data-toggle="tooltip" data-placement="right" title="" data-original-title="Menu 6"> <i class="fa fa-sitemap"></i> </a>
    </li>
</ul>    

管理員控制器

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');
class Admin_Controller extends MY_Controller {
    protected $data;
    public function __construct() {
        parent::__construct();
        $this -> has_access();
        $this -> template -> set_theme('saturn') -> set_layout('default', 'admin') -> set_partial('header', 'admin/partials/header') -> set_partial('navigation', 'admin/partials/navigation');
        //if (logged_in()) {
            $menu_items = array();
            $this -> template -> menu_items = $menu_items;
        //}
    }

    public function has_access() {
        $public_access = array('login', 'registration');
        $current_class = $this -> router -> fetch_method();
        $user_id = $this -> session -> userdata('user_id');
        if ($user_id == FALSE) {
            if (!in_array($current_class, $public_access)) {
                redirect('login', 'refresh');
            }
        }
        else {
            if ((!is_numeric($user_id)) || (strlen($user_id) < 5)) {
                $this -> session -> unset_userdata('user_id');
                $this -> session -> sess_destroy();
                redirect('login', 'refresh');
            }
            else {
                $this -> load -> model('user_model', 'user');
                $current_user = $this -> user -> get($user_id);
                if (!is_object($current_user)) {
                    $this -> session -> unset_userdata('user_id');
                    $this -> session -> sess_destroy();
                    redirect('login', 'refresh');
                }
                else {
                    // Make all controllers like roster, match_types, etc have access to the $current_user object.
                    $this -> data['current_user'] = $current_user;
                }
                if (in_array($current_class, $public_access)) {
                    redirect('dashboard', 'refresh');
                }
            }
        }
    }
}

我不知道這有多“高效”,但它確實有效。 我在我的應用程序上所做的有點不同但仍然相同的原則是我有一個表,其中包含用戶可以在數據庫中執行的所有可能的操作。 然后我為每個字段關聯一個 id,每個字段都是 1 或 0。所以最后查詢結果可能如下所示:

我的桌子看起來像:

UserId | Add | remove | modify | view | change | delete
-------------------------------------------------------
    23 |   1 |      0 |      1 |    1 |      1 |      0

然后我將它設置為一個會話變量作為一個數組

   while($row = $qry->fetch())
   {
      $field = key($r);
      $_SESSION['permissions'][$field] = $r[$field];
   }

那么在我的導航頁面上我有

   foreach ($_SESSION['permission'] as $k => $v)
   {
         if ($v == "1")
         { 
             echo "<li>" . $k . "</li>";
         }
   }

在這個例子中,你最終會得到:

  • 添加
  • 調整
  • 看法
  • 改變
  • 當然,您需要添加所有其他代碼(ul,ol)或其他任何...

    我是憑記憶打字的,所以如果有任何語法錯誤,請原諒我,我希望你能大致了解。

    我看到你的更新有很多對象數據,我猜你可以在這些數據上使用相同的原則。

      <?php $user_id = $this->session->userdata('user_id'); ?>
      <?php if( $user_id == '3' ):?>
      
      
      <!-- HTML FOR ADMIN NAVIGATION -->
    
      
      <?php elseif($user_id == '48' || $user_id == '49' || $user_id == '50'):?>
    
      
      <!-- HTML FOR MANAGERS NAVIGATION -->
    
      
      
      <?php else:?>
    
      
      <!-- HTML FOR GENERAL NAVIGATION FOR EVERYBODY ELSE -->
    
    
      
      <?php endif;?>
      
      
    

    暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM