如何基于用户会话角色仅展示其有权限查看的指定角色列表
角色权限过滤实现方案
逻辑说明
你需要在原有查询角色的逻辑中增加登录用户角色的权限过滤,具体改造步骤如下:
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
相关产品推荐
相关产品推荐

