【问题标题】:redirect to admin and user based on user role in code igniter根据codeigniter中的用户角色重定向到管理员和用户
【发布时间】:2017-11-19 21:06:06
【问题描述】:

如果管理员正在登录。我希望他转到管理员/仪表板。否则到用户仪表板。登录控制器如下。在用户表中,我有一列“角色”,值为“1”和“2”。 1 代表管理员,2 代表用户。并且有单独的角色表。

登录用户功能

public function login(){
    $data['title'] = 'Login';

    //validating form
    $this->form_validation->set_rules('username', 'Username', 'required');

    $this->form_validation->set_rules('password', 'Password', 'required');

    if($this->form_validation->run() ===FALSE){
        $this->load->view('templates/header');
        $this->load->view('users/login', $data);
        $this->load->view('templates/footer');
    }else{
        //Get username
        $username = $this->input->post('username');

        //Get password in md5 
        $password= md5($this->input->post('password'));

        //Login User.... passing username and password
        $user_id = $this->user_model->login($username, $password);

        //checking userid
        if($user_id){
            //creating session if user_id is present
            $user_data=array(
                'user_id'=>$user_id,
                'username'=>$username,
                'logged_in' => true
            );

            $this->session->set_userdata($user_data);
            //set message               
            $this->session->set_flashdata('user_loggedin', 'Login successful');
            redirect('posts');                  
        }else{
            //creating session if user_id is not present
            $this->session->set_flashdata('login_failed', ' Invalid credentials');
            redirect('users/login');
        }
    }
}

【问题讨论】:

  • 告诉我你的 login() 方法。
  • user_role 字段在哪里?你不把它放在会话中吗?
  • 您可能会觉得这很有帮助:Click Here

标签: codeigniter user-roles


【解决方案1】:

当代 CodeIgniter 的主要开发者,Lonnie Ezell 先生

在 CodeIgniter 论坛上的这篇文章中, https://forum.codeigniter.com/thread-67063-post-339924.html#pid339924

解释了 CodeIgniter 过滤器的使用 http://codeigniter.com/user_guide/incoming/filters.html

请注意并注意他所做的示例

考虑谁写这篇文章... 你有正确的 CodeIgniter 对用户和管理员可访问性分隔的方法

因此,让我们通过复制您在文档中找到的骨架来在 /App/Filters 中创建您的过滤器@ https://codeigniter.com/user_guide/incoming/filters.html#creating-a-filter

例如保存为/App/Filters/AccessFilter.php

根据您的需要自定义名称,并在 before 方法中填写您的 is-logged-in 检查和如果未登录则重定向操作

然后转到 /App/Config/Filters.php 中的过滤器配置设置和

  1. 为您全新创建的过滤器指定别名

    'accessCheck' => \App\Filters\AccessFilter::class

  2. 选择最适合您需要的政策,例如在 Filters.php 配置文件的底部,并注意它告诉的默认 CodeIgniter 安装附带的提示

    /* List filter aliases and any before/after uri patterns that they should run on, like: 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']], */

那么让我们使用它

public $filters = [
    'accessCheck' => ['before' => ['controllerName(/*)?']]
];

其中 controllerName 是在用户未登录时要拒绝访问的控制器

请注意,您可以拒绝多个控制器作为数组,并注意正则表达式条件将停止访问控制器的每个方法,包括 index() 一个

所以它会同时停止

  • site_url("/controllerName")
  • site_url("/controllerName/*")

奖金: 另请注意,过滤器可以在自定义路由字符串中设置为参数 https://codeigniter.com/user_guide/incoming/routing.html#applying-filters (这种选择性使用,将允许例如避免已经登录的用户访问登录页面或注册页面以及其他类似的“偏差”)

【讨论】:

    【解决方案2】:

    在验证用户时,您必须发送一个数组作为对登录调用的响应。

    $user_info = $this->user_model->login($username, $password); // User Info should be an Array $user_info = array('user_id' => '123', 'role' => '1'); if exist and $user_info = array(); if not
    
    
    if(isset($user_info['user_id']) && !empty($user_info['user_id'])) {
    $user_data=array(
            'user_id'=>$user_info['user_id'],
            'username'=>$username,
            'logged_in' => true
        );
    
    $this->session->set_userdata($user_data);
    $this->session->set_flashdata('user_loggedin', 'Login successful');
    if($user_info['role'] == 1){
        redirect('admin/dashboard');
    } else {
        redirect('user/dashboard');
    }
    
    }
    

    当然这会对你有所帮助。

    【讨论】:

      【解决方案3】:

      我不确切知道您为用户角色设置的列名。假设这是 user_role_id,这是我的示例。

          //checking userid
          if($user_id){
              //creating session if user_id is present
              $user_data=array(
                  'user_id'=>$user_id,  // you should change this variable to $user_id['id']
                  'username'=>$username,
                  'logged_in' => true
              );
      
              $this->session->set_userdata($user_data);
              //set message               
              $this->session->set_flashdata('user_loggedin', 'Login successful');
              if($user_id['user_role_id'] == 1){
                  redirect('admin/dashboard', 'refresh');
              }
              else if($user_id['user_role_id'] == 2){
                  redirect('users/dashboard', 'refresh');
              }                
          }else{
              //creating session if user_id is not present
              $this->session->set_flashdata('login_failed', ' Invalid credentials');
              redirect('users/login');
          }
      

      【讨论】:

      • 我没有像你说的那样............不能使用 stdClass 类型的对象作为数组............这个问题来了 if($user_id['user_role_id '] == 1){ 重定向('admin/dashboard', 'refresh'); } 在这部分
      • //登录检查用户凭据的函数 public function login($username, $password){ //验证凭据用户名和密码 $this->db->where('username', $username ); $this->db->where('password', $password); //从用户表中获取结果 $result=$this->db->get('users'); //检查用户是否存在于数据库中 if($result->num_rows()==1){ return $result->row(0)->userID; }else{ 返回假; } }
      • 那我的例子有什么问题??您收到任何错误还是将您重定向到错误的网址???
      • 您是否打印了 $user_id 来检查数据是否到来??
      • 我使用 $user_type = admin 而不是 $user_type_id = 1 .... 这对我来说很好....感谢您的帮助
      猜你喜欢
      • 2018-07-02
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多