2016-11-14 3 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. Примеры здесь повсюду в SO и в Интернете о том, как это сделать. CI уже проверяет действительный контроллер и контроллер/метод и будет error404, если не найден. Вы можете использовать '$ route ['404_override']' для выполнения эквивалента '$ this-> go ('auth');' зачем создавать класс 'go', когда у CI уже есть вполне приемлемый« маршрутизатор », который очень хорошо продуманный? Это было бы намного более упрощенным, если бы вы просто использовали существующую структуру структуры. – DFriend

+0

Я согласен, я думаю, что весь этот подход, хотя он и может работать, не самый надежный, надежный или поддерживаемый метод для достижения того, что на самом деле относительно тривиально - при вызове конкретного контроллера доступ пользователя разрешен. Эта аутентификация может быть достигнута в одной строке, и, что более важно, работа такой аутентификации может быть адаптирована гораздо более прозрачным способом. ИМХО это переутомление функции переназначения и совершенно ненужное. Опять же, IMHO, переназначение - это резерв для краевых случаев и сценариев, обходных решений и выплат. Лично я бы не стал использовать его для этого. – PaulD

ответ

0

мое предпочтение, как правило, положить чек прямо в конструкторе, а затем возвращает пользователю или администратору с $ this->

function __construct() 
{ 

    parent::__construct(); 

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

} 

Тогда $ this-> пользователь теперь доступен для всего того, что ваш контроллер звонки - модели и виды:

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

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