不知道大家怎么设计微服务下的权限的,很长时间了,一直没有找到很满意的答案。我的情况是这样的,还请大家帮忙出主意。
我情况如下:
1、目前系统中权限为分大类:系统权限(web操作的权限)和APP权限(手机APP操作权限)
2、每个权限又可以分为:功能权限和数据权限。 功能权限(比如菜单、按钮的显示与否),数据权限(查看本部门或下级部门等)
3、人员信息和权限等这些配置在一个微服务模块,而且是一个独立的数据库。
4、各子系统根据业务线拆成了不同的微服务模块,而且各自有独立的数据库,这里注意的是,与人员权限库不在同一个库里。
问题:
在子系统中,如果要查询某个用户能够查看的数据时,这里就无法通过关连权限表的方式。网上有很多方案,但基本上是不分库的,通过关联表的方式查询的。 但是我们系统是分库的,所以无法直接left join。
当前处理方案是:通过远程调用的方式,查询出这个用户能够查看的部门的List, 然后再带入到sql语句中,通过in的方式查询。 但是这种方式是每个子系统,很多方法都要调用时都要写一段判断权限等级,然后查询list的代码。造成很多重复代码,而且效率也比较低。
请问大家在微服务的架构中,数据权限是如何设计的呢?
我认可这个处理方法。
1、权限控制,实质上就是sql的过滤。 所以逃不了 left join 方式的过滤或是in方式的过滤,这个必要条件。
针对你提出的问题:
2、重复代码:这个可以尝试进行抽象提取出通用代码,提出一定系统编程、数据库字段要求规定, 配合使用通用代码, 减少重复代码。
3、效率低:远程查询权限数据,这个作为不经常变更、且使用率高的数据,可以使用缓存,减少数据库交互。尝试在最终查询资源sql的过滤上进行SQL优化。
网关、oauth2
我觉得是你这边微服务拆分有问题,一些需要sql join的数据不应该分,就冗余一些字段记录,不要想什么数据库设计范式,互联网和分布式应用有时候不吃这一套。
如果硬是要分,还可以用视图方式将多个库(schema)的数据表连起来,当然如果你们的分库是不同的数据库实例就当没说吧。
我认为权限与数据的具体查询条件无关,系统定义的权限就是关注资源(方法、视图页面)的访问权限,有权限访问的方法里,即可根据当前用户的授权信息(role, premission等)过滤数据即可。那么剩下只需要考虑如何就为多个微服务间实现单点登入授权,这个框架有很多,例如oauth或者其他以令牌方式实现的SSO。具体可以看看spring-cloud-security
可以 独立出一个 会员服务 和 一个权限服务。
请问为何要抽出web和app两套不同的权限来?
以及数据权限是怎么控制的?
你好,我也遇到了相同的问题,权限独立成了一个微服务,过滤数据权限用select in,由于我们业务比较复杂配置得也多,往往一个SQL会有几个select in,一个in的范围多的时候有上百个,导致性能异常低。
请问下你有找到合适的解决办法吗
自定义注解,切面实现中调用远程服务获取当前用户的数据权限标识(比如组织id:orgId),然后组装一段sql,大概是这个样子(org_id in (...) or user_id=xxx),orgId标识该用户有哪些数据权限,,userId标识没有组织的数据权限,但是属于自己的数据也能查看,,然后在service实现类方法上使用数据权限注解,将sql拼接上去,,如果你使用mybatisplus那就更方便了,直接apply就完事儿了
思路可以看看renren-security:https://gitee.com/renrenio/renren-security ,无非就是把他调用service的地方改成调其他服务,至于性能嘛,,鱼和熊掌不可兼得,要想多做点事儿肯定要付出点儿“小代价”