微服务架构权限验证系统除了 oauth2 外还有哪些解决方案?

2020-11-16 16:16:26 +08:00
 ReinerShir
如果做统一鉴权,每个请求都要去调一下鉴权接口,感觉效率很慢,有没有更加简单高效率一点的解决方案?

最近在想,是不是可以每个服务自己验证权限,但转念一想,每个服务自己鉴权也就意味着每个服务都可以修改权限,这样可能会不大安全。
3431 次点击
所在节点    程序员
22 条回复
yc8332
2020-11-16 16:32:34 +08:00
jwt
xuanbg
2020-11-16 16:40:20 +08:00
ReinerShir
2020-11-16 16:45:11 +08:00
@xuanbg 在网关中鉴权会不会不大好? 毕竟网关是每个请求都要通过的服务,请求量上来了影响效率
xuanbg
2020-11-16 16:49:32 +08:00
@ReinerShir 鉴权只需要 3ms,放哪里都差不多。再说,网关也可以有多个服务实例的呀,前面搞个 Nginx 做个负载均衡就行了。
defage
2020-11-16 16:51:35 +08:00
缓存
johnsona
2020-11-16 16:51:53 +08:00
oauth2 怎么搞呢?你自己搞一个 oauth2 server 授权吗?先自己描述清楚吧,据我所知,很多什么微服务 oauth2 的文章都在瞎扯。
很简单一个办法,登陆之后,返回 token,token 存 redis,value 是 dict 数据,比如权限集之类的。
请求来了直接去 redis 读取对应 token,比较权限就完事了
那些博客都在乱扯,还有什么 jwt,你要真无状态了,怎么冻结别人账户,你还是存下来搞黑名单之类的
ReinerShir
2020-11-16 17:00:28 +08:00
@johnsona 这个方法我知道,但是会有一些问题 1 、每个服务都需要连接 redis 2 、所有服务都可以修改权限(就是我开头说的那个意思,会不会有安全问题)
xuanbg
2020-11-16 17:03:52 +08:00
@johnsona oauth2 和 jwt 是两码事。oauth2 可以用第三方的,也可以自己造轮子,我比较倾向于自造轮子。因为授权其实是和业务有关联的,虽然只是弱关联,但用第三方的总归是不得劲,还是自己搞一个最合适。

不过我支持你关于 token 的说法,jwt 只适用不需要鉴权的 toC 系统或者权限较少的轻量级 toB 系统。稍微大一点的管理系统就不适合用 jwt 了。
5sheep
2020-11-16 17:04:42 +08:00
少年,OAuth2.0 不是给微服务鉴权用的。 当然,你非说大炮也能打死蚊子,咱就不用往下交流了。
xuanbg
2020-11-16 17:05:28 +08:00
@ReinerShir 服务怎么可能去修改权限?授权是专门的一个模块 /服务。你可以看我的: https://github.com/xuanbg/insight_auth
ReinerShir
2020-11-16 17:13:19 +08:00
@5sheep 标题描述可能不大正确,我想说的是,微服务架构除了走统一鉴权服务外还有没有其它解决方案(因为每个请求都要去鉴权),我知道 oauth2 只是一种协议


@xuanbg 嗯,我看了下,你这个框架应该也是走的统一认证服务,即每个请求都要去调鉴权接口,续期、删除等操作都是统一调用鉴权服务。
okletswin
2020-11-16 17:16:04 +08:00
OAuth 是做认证的,验证用户合法有效,非鉴权,权限的鉴定还需要你的系统自己实现
xuanbg
2020-11-16 17:20:30 +08:00
@ReinerShir 是的,基础就是 Auth 服务。我只是做了些优化,不需要每次都调用服务。当然也支持每次都调用服务,这样用户权限就可以实时更新。
johnsona
2020-11-16 19:24:07 +08:00
@xuanbg 你怎么搞
opengps
2020-11-16 19:25:58 +08:00
只有自己家的业务,直接 ip 白名单省心太多
johnsona
2020-11-16 19:27:56 +08:00
@xuanbg 我看到了
johnsona
2020-11-16 19:31:48 +08:00
@xuanbg 我个人觉得,一开始要不要搞复杂的鉴权,比如 rbac,因为你接口要定义权限,数据库要存储权限,还依赖后台管理系统去配置权限,这还只是功能权限,还有数据权限。还得看团队,团队其他人负责写业务逻辑的,还得提示人家在每个接口上面写上权限名或者权限码之类的,然后去后台自己配置一下,流程太繁琐了
johnsona
2020-11-16 21:12:17 +08:00
@ReinerShir oauth2 也是都要连接到一个 server 吧,权限是每个服务自己定义的,比如我这个服务的这个接口要求什么角色或者什么权限名才能访问,现在我变卦了,我说这个角色不让你访问,也没问题
xuanbg
2020-11-16 22:53:24 +08:00
@johnsona 你说的这些,在系统设计阶段规划好资源和对应接口 url 就行了,并不需要入侵到业务代码。我都是直接 sql 脚本写好,一次就导入了。也有后台可以配置,不过没有写脚本爽利。

数据权限和业务耦合太紧密,我的权限框架就没有考虑支持。最早是有支持按组织机构配置数据权限的,后来觉得虽然可配置,但还得在业务代码里面去实现,不能做到完全脱离业务就干掉了。
xuanbg
2020-11-16 22:59:44 +08:00
@xuanbg 上面说到资源的配置,在资源配置或导入完成,就可以直接在角色管理里面给角色分配权限了。用户登录时就会根据角色分配的权限生成一个授权码集合,然后网关上面收到请求就会根据 url 对应的授权码对用户进行鉴权了。

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

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

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

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

© 2021 V2EX