You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于用户会话角色仅展示其有权限查看的指定角色列表

角色权限过滤实现方案

逻辑说明

你需要在原有查询角色的逻辑中增加登录用户角色的权限过滤,具体改造步骤如下:

1. 改造Model层查询方法

在原有get_roles_idpair方法中增加入参$user_role_id(当前登录用户的角色ID),根据角色的can_manage字段值过滤返回的角色列表:

function get_roles_idpair($user_role_id = 0)
{
    $idpair = [];
    $this->db->from("crm_client_roles");
    
    if ($user_role_id > 0) {
        // 查询当前登录用户的角色信息
        $current_role = $this->db->get_where('crm_client_roles', ['roles_id' => $user_role_id])->row_array();
        $can_manage = $current_role['can_manage'] ?? 0;
        
        if ($can_manage == 0) {
            // 无管控权限时仅返回自身角色
            $this->db->where('roles_id', $user_role_id);
        } else {
            // 有管控权限时返回自身+可管控的角色
            // 此处假设can_manage存储的是可管控角色ID的逗号分隔字符串,如"3,4,5",可根据你的实际存储格式调整
            $manage_role_ids = array_map('intval', explode(',', $can_manage));
            $manage_role_ids[] = $user_role_id;
            $this->db->where_in('roles_id', $manage_role_ids);
        }
    }
    
    $query = $this->db->get();
    foreach ($query->result_array() as $row) {
        $idpair[$row['roles_id']] = $row['role'];
    }
    return $idpair;
}

2. 调整控制器层调用逻辑

调用Model方法时传入当前登录用户的角色ID即可,视图层代码无需修改:

// 示例:从session中取登录用户的角色ID,根据实际业务的存储位置调整
$login_user_role_id = $this->session->userdata('user_roles_id');
// 调用改造后的Model方法,your_model_name替换为你实际的Model类名
$data['roles'] = $this->your_model_name->get_roles_idpair($login_user_role_id);

兼容说明

如果你的can_manage字段是通过关联表存储可管控角色,而非单字段逗号分隔,只需要调整Model中$manage_role_ids的获取逻辑即可,整体权限过滤逻辑无需变动。

内容的提问来源于stack exchange,提问作者H2O

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:45:01