grbac单用户多角色权限管理平台

联合创作 · 2023-09-30 09:04

Go语言版本的权限管理服务平台,利用shiro权限管理设计思想,支持单用户多角色,可以具体到对某一个资源进行权限控制,比RBAC的资源管理更细粒度化。

权限管理服务平台

该服务采用比较流行的微服务思想, 利用shiro<域,动作,实体>思想,实现权限管理平台服务, 它支持单用户多角色 , 比RBAC的资源管理更细粒度化

权限管理服务平台的实现,主要由三个步骤构成:

  • 第一步:判断URL是否在白名单中,如果是,直接返回状态码:200
  • 第二步:解析URL,获取功能ID和实体ID,服务初始化阶段,会构建多叉树
  • 第三步:获取<域,动作,实体>, 并在redis中采用SET集合存储<UserId-FuncId, SET集合={实体1, 实体2, ... , 实体N}>

权限管理库表设计

权限管理库表

环境依赖

OpenResty配置

权限管理安插在Nginx Access访问阶段,对http请求的合法性进行校验

access_by_lua_file "/data/openresty/lua_files/test_ycfm_lua_files/access_by_grbac.lua"

-- GRBAC权限管理模块
ngx.req.read_body()
local bodyData = ngx.req.get_body_data()
ngx.log(ngx.ERR, "body data:", bodyData)
local cjson = require "cjson"
local info={
        ["body"] =  bodyData,
        ["method"] = ngx.req.get_method(),
        ["uri"] = ngx.var.uri,
}
local encode = cjson.encode(info)
local res = ngx.location.capture('/v1/grbac/functions/tree_parsing', {method=ngx.HTTP_POST, body=encode})
if res.status == 403 then
        ngx.exit(ngx.HTTP_FORBIDDEN)
end
--- 这里需要注意的地方:
--- 当http请求头Content-type: multipart/form-data时,由于子请求继承父请求的信息,导致body无法改变
--- 需要在nginx中location ~ /v1/grbac体中增加下面一句:
——- `proxy_set_header   Content-Type   "application/x-www-form-urlencoded"`;
--- 这样做body=encode才能生效

DEMO

浏览 6
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报