Go语言版本的权限管理服务平台,利用shiro权限管理设计思想,支持单用户多角色,可以具体到对某一个资源进行权限控制,比RBAC的资源管理更细粒度化。
权限管理服务平台该服务采用比较流行的微服务思想,利用shiro<域,动作,实体>思想,实现权限管理平台服务,它支持单用户多角色 ,比RBAC的资源管理更细粒度化
权限管理服务平台的实现,主要由三个步骤构成:
第一步:判断URL是否在白名单中,如果是,直接返回状态码:200第二步:解析URL,获取功能ID和实体ID,服务初始化阶段,会构建多叉树第三步:获取<域,动作,实体>,并在redis中采用SET集合存储<UserId-FuncId,SET集合={实体1,实体2,...,实体N}>权限管理库表设计权限管理库表
环境依赖beego框架redisOpenResty配置权限管理安插在NginxAccess访问阶段,对http请求的合法性进行校验
access_by_lua_file"/data/openresty/lua_files/test_ycfm_lua_files/access_by_grbac.lua"
--GRBAC权限管理模块ngx.req.read_body()localbodyData=ngx.req.get_body_data()ngx.log(ngx.ERR,"bodydata:",bodyData)localcjson=require"cjson"localinfo={["body"]=bodyData,["method"]=ngx.req.get_method(),["uri"]=ngx.var.uri,}localencode=cjson.encode(info)localres=ngx.location.capture('/v1/grbac/functions/tree_parsing',{method=ngx.HTTP_POST,body=encode})ifres.status==403thenngx.exit(ngx.HTTP_FORBIDDEN)end---这里需要注意的地方:---当http请求头Content-type:multipart/form-data时,由于子请求继承父请求的信息,导致body无法改变---需要在nginx中location~/v1/grbac体中增加下面一句:——-`proxy_set_headerContent-Type"application/x-www-form-urlencoded"`;---这样做body=encode才能生效DEMO
评论