MST
星途 面试题库

面试题:Redis脚本管理命令中如何初步实现简单的权限控制

在Redis环境下,假设已有一组基本的脚本管理命令如EVAL、EVALSHA等,阐述如何基于这些命令实现对不同用户或角色的简单权限控制,比如某些用户只能执行特定的脚本。
46.0万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 定义权限映射
    • 可以在Redis中使用哈希表(Hash)来存储用户或角色与可执行脚本的映射关系。例如,使用HSET user_1_script_permissions script1 1 script2 1表示用户user_1有执行script1script2的权限。这里键user_1_script_permissions可以根据实际情况灵活命名,值1表示有权限执行。
  2. 执行脚本前检查权限
    • 在执行EVALEVALSHA命令前,先通过Redis命令检查当前用户是否有权限执行该脚本。
    • 假设使用Lua脚本实现检查逻辑,如下:
-- 获取当前用户名,这里假设从外部传入用户名
local user_name = ARGV[1]
-- 获取要执行的脚本名,这里假设从外部传入脚本名
local script_name = ARGV[2]
-- 构造存储权限的键
local permission_key = "user_".. user_name.. "_script_permissions"
-- 检查用户是否有权限执行该脚本
local has_permission = redis.call('HEXISTS', permission_key, script_name)
if has_permission == 1 then
    -- 用户有权限,返回允许执行的标识,这里返回1
    return 1
else
    -- 用户无权限,返回不允许执行的标识,这里返回0
    return 0
end
  • 然后在应用代码中,先调用这个Lua脚本检查权限:
import redis

r = redis.Redis(host='localhost', port=6379, db = 0)
user_name = "user_1"
script_name = "script1"
check_permission_script = """
local user_name = ARGV[1]
local script_name = ARGV[2]
local permission_key = "user_".. user_name.. "_script_permissions"
local has_permission = redis.call('HEXISTS', permission_key, script_name)
if has_permission == 1 then
    return 1
else
    return 0
end
"""
permission_result = r.eval(check_permission_script, 0, user_name, script_name)
if permission_result == 1:
    # 如果有权限,执行实际的脚本
    actual_script = "return '执行脚本的结果'"
    result = r.eval(actual_script, 0)
    print(result)
else:
    print("用户无权限执行该脚本")
  1. 管理权限
    • 当需要新增或修改用户权限时,使用Redis的HSET命令更新权限哈希表。例如,要给user_1新增执行script3的权限,可以执行HSET user_1_script_permissions script3 1
    • 当需要删除用户权限时,使用HDEL命令。例如,要删除user_1执行script2的权限,可以执行HDEL user_1_script_permissions script2