2014-02-20 8 views
3

Я застрял в понимании того, что является наиболее эффективным методом выполнения:Роли Разрешения и навигация

У меня есть CMS с различными типами пользователей. Все пользователи имеют доступ к одной и той же CMS, однако ссылки на боковой панели (навигации) будут состоять из того, что у пользователя есть разрешение на доступ.

Я пытаюсь выяснить, как я должен собирать это вместе. У меня есть Admin_Controller, который может быть полезен для ввода логики, но вам нужна помощь в выяснении, как это сделать.

Чтобы пояснить, что я хочу, у меня установлена ​​следующая таблица пользователей и настройка навигации. Предположим, что первый пользователь (1) является гостем, поэтому они могут просматривать только панель управления и ничего больше как эту роль. Возможно, пользователи с ролью 2 могут просматривать панель инструментов и еще 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>  

Admin 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'); 
       } 
      } 
     } 
    } 
} 
+0

'Я застрял в понимании того, что является наиболее эффективным методом выполнения следующих действий:« Я полагаю, что вы застряли, вы ничего не начали? например, покажите нам ваш контроллер и модель. Я могу дать ответ, но я не хочу освобождать его бесплатно, покажу нам какой-то код, а не DOM. –

+0

. Я включу свой контроллер администратора, но, судя по всему, я не знаю, с чего начать. Я обновлю свой пост. – user2576961

ответ

2

Я не знаю, как "эффективный" это, но это работает. Что я сделал в своем приложении, которое немного отличается, но все же те же принципы, что у меня была таблица со всеми возможными вещами, которые пользователь мог бы сделать в db. Затем я связать идентификатор сделать каждое поле, с каждым полем является либо 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>"; 
     } 
    } 

в этом примере, вы бы в конечном итоге с:

  • добавить
  • изменить
  • вид
  • изменение
  • , конечно, нужно добавить все остальные кода (улица, ол) или независимо ...

    Я печатаю это из памяти, поэтому простите меня, если есть какая-либо синтаксическая ошибка, я надеюсь, вы получите общую идею.

    Я вижу, что ваше обновление имеет много данных об объекте, и я предполагаю, что вы можете использовать тот же принцип для этих целей.

    +0

    Это хороший ответ. – user2576961

    Смежные вопросы