在身份验证鉴权与业务分离的系统中, 如何实现根据用户属性查询业务信息?

在身份验证与业务逻辑分离的系统中,如果需求要求根据用户的属性,例如名称、用户组、年龄、角色等非唯一标识符进行业务信息查询,常见的解决方案是将这些属性信息与唯一标识符(如 user_id)进行关联,通过索引或联合查询来实现。以下是几种具体实现方案:

1. 用户属性信息的集中存储和索引

用户属性存储:

将用户的名称、用户组、年龄、角色等属性信息存储在身份管理系统或专门的用户信息数据库中。

该数据库可以与身份验证服务(如 OAuth、SSO 等)协同工作,提供用户属性的查询接口。

基于属性的查询方式:

在收到查询请求时,业务系统首先查询用户信息数据库,通过指定的查询条件(如名称、用户组、年龄或角色)获取相应的 user_id。
然后,业务系统使用 user_id 在业务数据库中查询与该用户关联的业务数据。

实现方式:

为用户属性(如名称、用户组、角色等)建立索引,以便快速查找满足条件的用户。例如:

1
2

SELECT user_id FROM users WHERE name = 'John Doe' AND group = 'Admin' AND age > 30;

查询得到的 user_id 可以用于进一步关联业务数据,如订单、账户信息等。

2. 基于检索服务的实现(如 Elasticsearch)

用户属性索引:

对用户信息数据库使用分布式搜索引擎(如 Elasticsearch、Solr 等),对用户的各类属性进行全文索引。这使得系统能够支持复杂查询,如按用户名称、用户组、年龄或角色等多个字段进行条件组合检索。

查询流程:

系统接收到用户的查询条件时,首先通过 Elasticsearch 对用户的属性进行检索,返回符合条件的用户集合(通常是 user_id 列表)。
然后根据这些 user_id 在业务系统中查询对应的业务数据。

优势:

支持复杂查询,且搜索性能高效。可以实现例如模糊搜索、范围查询(如年龄在 20-30 之间)、多字段组合查询等。

3. 属性与业务数据联合查询

联合查询模式:

如果系统不想通过多个步骤查询,也可以考虑在业务数据库中存储部分用户属性,如名称、用户组或角色,直接与业务数据建立关联。

在业务数据库中为这些属性建立索引,这样可以直接通过这些属性在业务数据库中进行联合查询。例如:

1
2
3
4
5

SELECT *
FROM orders o
JOIN users u ON o.user_id = u.user_id
WHERE u.name = 'John Doe' AND u.group = 'Admin' AND u.age > 30;

这种模式减少了查询用户数据库的步骤,但需要确保用户属性在业务数据库中及时同步更新。

4. 使用 GraphQL 等 API 网关技术

动态查询:

使用 GraphQL 等查询语言,前端可以通过一个 API 端点发起针对用户属性的查询。GraphQL 能够灵活地组合查询条件,并通过身份验证服务返回符合条件的用户及其关联数据。

在这种架构下,GraphQL 可以整合不同数据源,前端可以动态构建查询条件,无需分别调用不同的接口。

5. 基于用户组和角色的访问控制(RBAC/ABAC)

基于角色的访问控制:

系统可以实现基于角色的访问控制(RBAC),通过角色信息来过滤和查询业务数据。

业务数据和角色之间的关系可以在业务数据库中建立。

例如,用户的角色和用户组可以映射到特定的业务数据范围,系统根据角色查询与之相关的业务信息。

基于属性的访问控制(ABAC):

在 ABAC 中,可以根据用户的属性(如年龄、组别等)动态决定其访问权限。在业务查询时,系统会根据用户属性来筛选其可以访问的数据。

例如:

用户组为”管理员”的用户可以访问所有订单;

年龄大于 18 岁的用户可以访问特定的内容或数据集。

缓存和分布式查询

缓存查询结果:

对于频繁查询的用户属性,可以将用户与其业务数据的关联结果缓存到高速缓存(如 Redis、Memcached 等)中。这使得查询用户属性后可以快速获取相关业务数据,而无需每次都查询数据库。

分布式查询:

在微服务架构下,可以通过分布式查询系统(如 Apache Kafka、Apache Druid 等),让不同微服务处理不同部分的数据查询,最后将结果合并。例如,用户信息服务负责根据用户属性返回用户 ID,业务服务负责查询用户 ID 对应的业务数据。

扩展查询接口(API 层实现)

在 API 层上扩展查询接口,使得客户端可以通过名称、用户组、年龄、角色等非唯一标识符发起查询请求。API 层负责将这些查询条件映射为后台数据库的查询操作。
例如:

1
2
3
4
5
6
{
"name": "John Doe",
"group": "Admin",
"age": { "gt": 30 },
"role": "Manager"
}

API 接收到请求后,会查询用户服务,获得符合条件的用户 ID,然后再去业务服务查询业务信息。

6. 总结

根据用户的名称、用户组、年龄、角色等属性查询业务信息的实现方式,核心在于如何高效地将这些属性与用户的唯一标识符(如 user_id)进行关联,并通过 user_id 进行后续的业务数据查询。通过索引、联合查询、缓存和分布式系统等方式,可以满足复杂查询的需求,并确保系统在大规模用户数据下仍然高效运行。

在身份验证鉴权与业务分离的系统中, 如何实现根据用户属性查询业务信息?

https://pengtech.net/product/query_on_auth_and_business_decoupled_systems.html

作者

鹏叔

发布于

2024-09-13

更新于

2024-09-13

许可协议

评论