在系统中,可能存在受限制的数据。 有时,应根据用户或组成员身份轻松限制或授予对特定实体的访问权限。
在微服务架构中实现这一点的最佳方法是什么?
访问控制,管理权限等是微服务器本身的责任吗?开发人员必须为每项服务实现访问控制,存储和更新权限。似乎不是非常强大且容易出错的方法。
创建专用的微服务处理权限管理?其他微服务器将调用此服务,以在返回结果之前检查每个实体和过滤实体的访问权限。集中式权限存储和管理是一个优势,但微服务必须为每个实体调用“权限服务”,以检查可能对性能产生负面影响的访问权限。开发人员仍然必须将访问检查集成到他们的服务中,这会留下错误的空间。
对API网关或服务网格进行访问控制。可以考虑一种自动过滤所有服务响应的实现。但是在微服务返回实体列表的情况下,应该检查每个实体的权限。仍然是潜在的性能问题。
考虑以下合成示例。 医疗保健系统处理测试结果,X射线图像等。健康信息非常敏感,不应披露。
测试结果仅适用于:
主治医生可能会将患者送到另一位专科医生处。新医生也应该可以访问测试结果。因此可以动态授予访问权限。
因此,每个实体(例如测试结果,X射线图像)都有一组规则允许用户和组访问它。
想象一下,有一个名为“测试结果服务”的微服务处理测试结果。它应该负责访问控制,管理权限等吗?或者应该提取权限管理来分离微服务?
医疗保健系统也可以处理对医生的访问。有关患者就诊的信息应提供给:
这是不同实体类型的示例,需要基于用户或组成员身份的实体级访问限制。
当需要实体级访问控制时,很容易想象更多的例子。
答案 0 :(得分:4)
我选择了以下通用解决方案。
设计特色:
答案 1 :(得分:0)
看起来安全性是业务逻辑的一部分。在两个例子中。
然后安全性可能是数据方案的一部分。
例如,
病人可以看到他的测试:
select * from test_result where patient_id=*patient_id*
医生可以从他的医疗部门看到所有的测试:
select * from test_result where branch_id=*doctor_branch*
我认为单独的MS用于访问控制是一个非常糟糕的主意,可能导致严重的性能问题。试想一下,实体访问为零的人试图每次都获取所有实体的情况:)你总是需要处理比实际需要的更大的结果集。
答案 2 :(得分:-1)
首先,拥有一个单独的(每个微服务)安全模型是一个非常糟糕的主意。它应该是单一的始终贯穿所有应用程序,因为它可能导致访问管理,权限授予和不同微服务中的实体之间的映射的地狱。
第二,我认为您理解 如何组织微服务是错误的? 您应该将功能分解为微服务的原则:通过功能,通过域名等。查看单一责任,DDD和其他方法,帮助您实现MS的明确行为。
所以,在最好的情况下,你应该:
第三, 如何运作? :
检查给定用户对health-info-MS中所需数据的访问权限。在这里,我们有几个选项如何做到这一点:
如果使用内存网格(hazelcast,coherence),则可以使用基于安全属性的谓词轻松创建过滤器。
如果你正在使用SQL(hibernate,普通SQL等),你应该生成查询 只返回允许的数据 - 添加特定的安全性 where子句的条件
在 中进行安全性检查的SQL查询的更多细节:在SQL执行之前(如果使用spring-method-auth hook很容易使用hibernate& spring) )您应该解析分配给用户的所有权限 - 您可以通过调用auth-MS来执行此操作。
我们为 TestResult 实体创建了CRUD权限 - VIEW,EDIT,DELETE。
DOCTOR可以看到任何TestResults的角色 - 因此,它具有VIEW权限
PATIENT角色只能看到他/她的TestResults
因此,您创建了一个业务规则,为每个业务角色(DOCTOR,PATIENT,LAB等)提供正确的 where子句 ,最后为SQL提供请求将是:
对于已分配VIEW权限的患者:
select * from test_result where id=*patient_id* and 1=1
对于尚未分配VIEW权限的患者:
select * from test_result where id=*patient_id* and 1!=1
注意:在业务规则中,我们可以添加1 = 1或1!= 1来允许/限制查询结果