Какова наилучшая практика для системы входа на основе ролей в Codeigniter

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

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

В основном я не уверен, как распределить различные представления в роли роли.

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

Я также устанавливаю то же условие if с сеансом в контроллере для предотвращения прямого доступа к этой странице.

Вот мой код, который я применил к меню и контроллеру.

<?php $login_role= $this->session->userdata('user_data'); if($login_role['user_role'] === 'super_admin'){ ?><li><a href="<?php echo base_url('account/view_account'); ?>"> <div>Account</div></a></li><?php } ?> 

и такое же условие в контроллере

  public function index() { $login_role= $this->session->userdata('user_data'); if($login_role['user_role'] === 'super_admin') { $this->load->model('location_model'); $city_list = $this->location_model->get_city_list(); $state_list = $this->location_model->get_state_list(); //log_message('info', 'City and State list will sucessfully loded.'); $this->load->view('admin/account_insert',['city_list'=>$city_list,'state_list'=>$state_list]); } else { redirect('admin/dashboard','refresh'); } } 

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

Я использую единую систему входа в систему для всех ролей пользователей. У меня есть таблица пользовательских ролей, и у меня есть идентификатор роли в таблице пользователей. Затем у меня есть имена контроллеров, соответствующие этим ролям. При входе пользователя я проверяю роль и перенаправляю пользователя на этот контроллер после проверки. Ниже приведена функция индекса моего контроллера входа.

 public function index() { if(!$this->isLoggedIn()) { $data['title']='Title You want to set on Page'; if($_POST) { $config=array( array( 'field' => 'email', 'label' => 'Email', 'rules' => 'trim|required|valid_email', ), array( 'field' => 'password', 'label' => 'Password', 'rules' => 'trim|required', ), ); $this->form_validation->set_rules($config); if($this->form_validation->run()==false) { $data['errors']=validation_errors(); $this->load->view('static/head', $data); $this->load->view('admin/login'); } else { $user=$this->admin_model->checkUser($_POST); if(!empty($user)) { if($user['role']==1) { $user['type']='admin'; } elseif($user['role']==2) { $user['type']='team'; } elseif($user['role']==3) { $user['type']='client'; } elseif($user['role']==4) { $user['type']='manager'; } $this->session->set_userdata($user); redirect(base_url().$user['type']); } else { $data['errors']='The credentials you have provided are incorrect or your account has not been approved yet.'; $this->load->view('static/head', $data); $this->load->view('admin/login'); } } } else { $this->load->view('static/head', $data); $this->load->view('admin/login'); } } else { redirect(base_url().$this->session->userdata['type']); } } 

Он отлично работает для меня. Кроме того, в каждом контроллере у меня есть функции, чтобы проверить, зарегистрирован ли пользователь для этой роли, как это

 public function isLoggedIn() { if(!empty($this->session->userdata['id'])&& $this->session->userdata['type']=='team') { return true; } else { return false; } } 

И я передаю свою индексную функцию этого контроллера. Например, следующая функция индекса контроллера команды

 public function index() { if($this->isLoggedIn()) { $data['menu']=$this->team_model->getMenuItems(); $data['task_logs']=$this->admin_model->getAllLogs(); $data['title']='Title'; $this->load->view('static/head',$data); $this->load->view('static/header'); $this->load->view('static/sidebar'); $this->load->view('team/dashboard'); $this->load->view('static/footer'); } else { redirect(base_url()); } }