【问题标题】:codeigniter routing and redirectingcodeigniter 路由和重定向
【发布时间】:2015-02-21 13:19:44
【问题描述】:

当我输入我的基本 URL http://localhost/myproject/admin 时,它会不断将我发送到我的权限页面。 http://localhost/myproject/admin 是 base_url()。

我的 core/Controller.php 它的工作原理是它检查是否可以访问控制器,如果不在忽略列表中,则被重定向到权限,否则可以访问页面。

我想知道是否有可能添加我的base_url() 以便它忽略它并让我可以访问它。我不确定在下面的代码中添加它的最佳位置。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// I am not using MY_Controller works with Controller fine.
class Controller extends CI_Controller { 

public function __construct() {
    parent::__construct();

    $url = $this->uri->segment(1).'/'.$this->uri->segment(2);

    if (isset($url)) {
        $route = '';

        $segment = explode('/', $url);

        if (isset($segment[0])) {
            $route .= $segment[0];
        }

        if (isset($segment[1])) {
            $route .= '/' . $segment[1];
        }

        // $route would equal example: common/dashboard

        // $segment[0] folder i.e common
        // $segment[1] controller 

        $ignore = array(
            'common/dashboard',
            'common/login',
            'common/forgotten',
            'common/reset',
            'error/not_found',
            'error/permission'
        );

        if (!in_array($route, $ignore)) {
            redirect('permission');
        }
    }
}
}

【问题讨论】:

  • 我已经准备好配置路由和默认控制器了。
  • 有更好的方法,比如使用包含所有路由的配置文件的钩子,或使用_remap() 函数。无论如何,您可以将admin/index 添加到您的$ignore 数组中
  • 会更喜欢上面的。因为我还有其他权限会添加到它,除非你可以展示一个关于在钩子中做什么的例子。
  • 当然,检查我的答案
  • 我确信你已经配置了路由,但是如果你想为特定情况做一些其他的覆盖,路由应该仍然能够使用(:any)和索引URI参数$1/$2等来实现这一点跨度>

标签: codeigniter codeigniter-routing


【解决方案1】:

使用 Hook 检查权限:

1 - 创建一个配置文件config/acl.php:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$acl = array(
    'role_permission' => array(
        'role/index' => 'access_show_roles_list',
        'role/add' => 'access_add_role',
        'role/edit' => 'access_edit_role',
        'role/delete' => 'access_delete_role',
        'permission/index' => 'access_permission_list',
     ),
    'users' => array(
        'user/index' => 'access_show_users_list',
        'user/add' => 'access_add_user',
        'user/edit' => 'access_edit_user',
        'user/delete' => 'access_delete_user',
        'user/profil' => 'access_profil_user',
        'user/showpasswd' => 'access_show_password',
    ),
);
$config['acl'] = $acl;

2 - 创建一个 Hook Hooks/Autorization.php :

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Authorization {

    private $ci;

    public function __construct(){
        $this->ci = &get_instance();
    }

    public function authorize()
    {
        if (!$this->_has_access()) {
            if ($this->ci->input->is_ajax_request())
                die('-9');

            show_404();
        }
    }

    private function _has_access() {
        $class = $this->ci->router->class;
        $action = $this->ci->router->method;
        $full_action = $class . '/' . $action;
        // --> Start
        $acl = $this->ci->config->item('acl');
        $arr_acl = array();

        array_map(function($value) use (&$arr_acl){
            $arr_acl = array_merge($arr_acl, $value);
        }, array_values($acl));
        // --> End

        if (isset($arr_acl[$full_action])
            && !in_array($full_action, $this->ci->user->permissions))
            return false;

        return true;
    }
}

3 - 通过在config/config.php 中将enable_hooks 设置为TRUE 来激活钩子:

$config['enable_hooks'] = TRUE;

4 - 设置 Autorization 钩子,config/hooks.php :

$hook['post_controller_constructor'][] = array(
    'class'    => 'Authorization',
    'function' => 'authorize',
    'filename' => 'Authorization.php',
    'filepath' => 'hooks',
    'params'   => array()
);

5 - 添加权限的翻译,language/english/permissions_lang.php:

/* ROLE */
$lang['access_show_roles_list'] = "Show all roles.";
$lang['access_add_role'] = "Add new role.";
$lang['access_edit_role'] = "Update a role.";
$lang['access_delete_role'] = "Delete a role.";
$lang['access_change_role_status'] = "Change role stat Enabled/Disabled.";
$lang['access_permission_list'] = "Access to the permissions list.";

6 - 将acl.php 添加到自动加载文件中,在config.autoload.php 中:

$autoload['config'] = array('acl');

就是这样。

【讨论】:

  • 告诉您需要的其他权限存储在 session in_array $this-&gt;session-&gt;userdata('access') 中,而不是手动输入 $acl 我可以添加 in_array($this->session->userdata('access'))如此处所示 var dump sessions stackoverflow.com/questions/28625941/… 只需查看 var dump
  • 我忘了说,数据库中存储了角色和权限的一部分,当用户登录时,您获取该用户角色的所有权限$this-&gt;user-&gt;permissions
  • 我不需要配置部分我的所有访问权限都存储在该会话数组中我该如何使用它
  • 你可以试试:!in_array($full_action, $this-&gt;ci-&gt;session-&gt;userdata('access')) return false
  • 由于仍然需要 config_item 而没有工作很多错误
【解决方案2】:

没有人提到,但您使用reserved name 作为您的控制器。 更改它,看看是否有效。

【讨论】:

  • 我知道我试过没问题,但更喜欢让所有扩展类都相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 2023-01-14
相关资源
最近更新 更多