php - 角色权限和导航

标签 php codeigniter

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

我有一个包含不同类型用户的 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>    

管理 Controller

<?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。所以最终查询结果可能如下所示:

我的 table 看起来像:

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

然后我将其作为数组设置为 session 变量

   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 - 角色权限和导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21899515/

    相关文章:

    php - 使用 php-cli 时出现 pg_connect 错误

    php - 如何让数组和 session 变量在浏览器刷新后恢复为空白?

    php - MySQL 和 date() 查询

    javascript - Javascript/PHP/Codeigniter 中的悬停事件

    php - 改变PHP框架容易还是困难?

    php - 如何按元素检查和取消设置/设置 SESSION?

    php - 在包含单引号和双引号的字符串中转义单引号

    mysql - Codeigniter 事件记录 COUNT 返回 null

    php - Youtube API如何使用GetUserUpload方法PHP获取所有视频ID

    php - Codeigniter 发送谷歌邮件错误