diff --git a/src/share/redis.lua b/src/share/redis.lua index 52c0ed9..c208848 100644 --- a/src/share/redis.lua +++ b/src/share/redis.lua @@ -59,4 +59,8 @@ function _M:ttl(key) return self.red:ttl(key) end +function _M:call(key, ...) + return self.red:call(key, ...) +end + return _M \ No newline at end of file diff --git a/src/test/test.lua b/src/test/test.lua index d05b88e..f071e17 100644 --- a/src/test/test.lua +++ b/src/test/test.lua @@ -333,6 +333,14 @@ else end --]] +local perm = require("util.permissionfilter") + +local rest = perm.getRolePermissions("admin") +for _, row in pairs(rest) do + print(row.key) +end + +perm.clearRolePermissions("admin") --读取用户表、角色表和权限表中配置的权限数据 local roleDao = require("dao.role") diff --git a/src/util/permissionfilter.lua b/src/util/permissionfilter.lua new file mode 100644 index 0000000..beeb2a5 --- /dev/null +++ b/src/util/permissionfilter.lua @@ -0,0 +1,79 @@ +--- +--- Generated by EmmyLua(https://github.com/EmmyLua) +--- Created by admin. +--- DateTime: 2025/11/8 11:15 +--- 权限过滤器,用于验证用户是否有权限进行接口访问,通过redis进行权限获取 + +local red = require("share.redis") +local _M = {} + +-- 为角色增加权限 +function _M:addRolePerms(role_name, permissions, description) + local key = role_name.."-"..permissions + local res, err = red:get(key) + if res ~= nil then return end + --键值不存在则增加到redis中 + res, err = red:set(key, "1") +end + +-- 检查角色是否拥有指定权限 +function _M:hasPermission(role_name, permission) + if role_name == nil or permission == nil then + return false + end + + -- 检查直接权限 + local key = role_name.."-"..permission + local res, err = red:get(key) + if res ~= nil then + return true + end + return false +end + +-- 检查多角色是否拥有所有指定权限 +function _M:hasMultiRoleNamePermission(rolenameTable, permission) + if rolenameTable == nil or permission == nil then + return false + end + + -- 检查直接权限 + for i = 1, #rolenameTable do + local role_name = rolenameTable[i] + local key = role_name.."-"..permission + local res, err = red:get(key) + if res ~= nil then + return true + end + end + return false +end + +-- 获取角色的所有权限 +function _M:getRolePermissions(role_name) + local allPermissions = {} + if role_name == nil then + return allPermissions + end + --获取redis中所有匹配的数据内容 + local prefix = role_name.."-" + local cursor = "0" + local result = red:call('SCAN', cursor, 'MATCH', prefix .. '*', 'COUNT') + cursor = result[1] + for _, key in ipairs(result[2]) do + table.insert(allPermissions, key) + end + return allPermissions +end + +-- 清除角色的所有权限 +function _M:clearRolePermissions(role_name) + --将redis中角色相关的键值去掉 + local keys = red:call("KEYS", role_name.."-*") + if #keys > 0 then + red:call("DEL", unpack(keys)) + end +end + +-- 导出模块 +return _M \ No newline at end of file