求教一下后台的 API 鉴权的具体实现

2023-02-27 18:03:08 +08:00
 ifhover
语言用的 go ,框架是 echo ;最近想自己撸个后台的轮子结果卡在这块了
想实现一个常规的权限管理,关联关系:用户->角色->菜单,假如角色“普通用户”没有菜单“文章管理”的权限,那文章的增删改查接口肯定要拦截"普通用户"的请求,但是不知道怎么在中间件判断用户请求的接口是文章管理的接口

想了两种方式:
方法 1:新建一个 API 表和角色表关联,手动录入接口 url 的正则表达式,在中间件里查角色关联的所有 API 数据后循环匹配当前请求 url 如果没匹配到就是没有权限;

方法 2:写一个自定义函数 func AdminApi(name string),记录 name 后返回一个中间件,在 API 管理界面展示记录到的 name 列表并可以分配给角色,每个 AdminApi 函数返回的中间件闭包判断传入的 name 是否存在于当前角色的 name 列表;

感觉两种方法都各有利弊,请教一下各位都是怎么做的 纠结好几天了🥲
1951 次点击
所在节点    Go 编程语言
7 条回复
Nazz
2023-02-27 18:17:02 +08:00
一个角色对应多个 API 权限,一个用户可以拥有多个角色,一个按钮 /页面对应多个 API 权限,然后去动态渲染菜单
Nazz
2023-02-27 18:19:49 +08:00
鉴权的时候,在中间件里面定义可变参数,静态路径不传,动态路径要传,别用正则
pkoukk
2023-02-27 18:50:26 +08:00
RBAC 鉴权,按角色分配权限,再赋予用户角色
go 有现成的实现 https://casbin.org/docs/middlewares
daytonight
2023-02-27 21:24:39 +08:00
casbin
ifhover
2023-02-27 23:39:01 +08:00
@daytonight
@pkoukk
好的 已经在学 casbin 了
ifhover
2023-02-27 23:49:00 +08:00
@Nazz 感谢指点,刚刚发现 echo 的 context 有个.Path()方法可以返回完整的注册时的路径 /admin/article/:id😁
czyt
2023-03-01 23:12:27 +08:00
casbin\opa

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/919612

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX