From fc5967b213ae856b9541379a0f105ce1ac644461 Mon Sep 17 00:00:00 2001 From: wanglei <34475144@qq.com> Date: Sat, 8 Nov 2025 13:52:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9D=83=E9=99=90=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E5=99=A8=EF=BC=8C=E5=B9=B6=E5=AF=B9=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E7=9A=84=E8=A7=92=E8=89=B2=E5=92=8C=E6=9D=83=E9=99=90=E7=9A=84?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E8=BF=9B=E8=A1=8C=E5=B0=81=E8=A3=85=E5=B9=B6?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E5=88=B0redis=E4=B8=AD=EF=BC=8C=E7=BC=96?= =?UTF-8?q?=E5=86=99=E7=AE=80=E5=8D=95=E7=9A=84=E6=B5=8B=E8=AF=95=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=AF=B9=E5=87=BD=E6=95=B0=E8=BF=9B=E8=A1=8C=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/share/redis.lua | 4 ++ src/test/test.lua | 8 ++++ src/util/permissionfilter.lua | 79 +++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/util/permissionfilter.lua 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