✅派聪明 RAG 系统用户管理面试题预测 – 朝汐の小站
✅派聪明 RAG 系统用户管理面试题预测
本文最后更新于 259 天前,如有错误请邮件至 zhiligyi222na@gmail.com

1.我们来聊聊你项目中的用户管理模块。你能先整体介绍一下这个模块都实现了哪些核心功能吗?它的主要设计目标是什么?

派聪明的用户管理模块,主要围绕身份认证权限控制数据隔离三个目标来展开。

首先是用户注册与登录。用户通过用户名和密码完成登录认证,成功后系统会下发 JWT 作为用户的访问凭证,实现后续接口的身份校验。

其次是基于角色的权限管理。派聪明设计了 ADMIN 和 USER 两种角色。管理员拥有管理知识库、查看用户列表等最高权限,而普通用户只能查看自己私有的知识库和公开的知识库。

更有特色的是派聪明设计了一套“组织标签”机制。除了角色控制外,系统还允许为每个用户设置一个或多个“组织标签”,并支持设置“主组织”,用于实现多租户数据隔离——例如在文档上传或知识检索过程中,派聪明会基于用户的组织标签对数据进行过滤,确保用户只能访问自己组织内部的资源。

整体来说,用户管理模块不仅实现了基本的注册登录功能,还通过 RBAC 定义了用户“能做什么” ,还通过 组织标签定义了用户“能看什么”

2.你提到了‘角色’和‘组织标签’,听起来这是一个很有意思的权限设计。为什么在有了传统的用户/管理员角色之后,还要引入‘组织标签’这个概念?它解决了什么具体问题?

为了解决 RBAC 的两个局限:权限控制粒度不够细和没办法基于数据属性做动态授权

RBAC 解决的是“谁能做什么”的问题,通过为用户赋予角色,来限定功能权限。但在多部门、多租户的企业应用中,这种模式很容易遇到角色爆炸的问题。比如,公司不同部门之间希望数据互相隔离,传统做法是为每个部门定义角色,但这会导致角色数量迅速膨胀。同时,RBAC 无法基于具体的文档属性去动态判断某条数据是否对某个用户可见。

组织标签机制,本质上是一种 ABAC 的简化实现。在用户层面,为每个用户打上组织标签(如部门),在文档层面,为每份文档标记上传者所属的组织标签。当用户访问知识库时,系统能够动态地基于“当前用户的组织标签”与“文档的组织标签”进行匹配过滤,从而实现更细粒度的数据隔离与动态授权

这种“角色 + 标签”的混合机制,让派聪明既保留了 RBAC 模型的简单直观,又通过组织标签实现了多租户、多部门场景下的权限支持。例如,研发部的用户可以看到“研发部”标签下的所有文档,而无法访问市场部的知识库;同时,某些标记为“公开”的文档,任何用户都可以跨部门访问。

3.了解了。那在技术实现上,用户登录成功后,你是如何维持他的登录状态的?是用的传统Session,还是像JWT这样的Token方案?为什么做这个选择?

在派聪明项目中,我们采用了JWT 的方案,而不是传统的 Session 认证机制。


从技术实现来看,JWT 的认证流程大致分为三个步骤。首先,在用户成功登录后,系统会生成一个包含用户信息的 Token。该 Token 中封装了用户 ID、角色、组织标签等关键信息,签名后返回给前端。然后,前端会在后续的每次 API 请求中,将该 Token 放在 HTTP 请求头的 Authorization 字段中传回服务器。最后,所有受保护的接口请求都会经过 JwtAuthenticationFilter 过滤器拦截处理。过滤器会从请求头中提取 Token,验证合法性和时效性,并将解析出的用户身份信息注入到 Spring Security 的上下文中,供整个请求链路使用。

之所以选择 JWT,主要是因为 JWT 是无状态的,每个请求都通过 Token 进行信息认证,不需要做 Session 同步。第二,我们把角色、组织标签等权限数据嵌入到了 Token 中。后端在处理请求时,不需要每次从数据库加载用户信息,直接解析 Token 就可以获取用户权限,很方便。

4.你是如何设计JWT的Payload的?除了用户ID,你还在里面存放了哪些信息?把这些信息放进去,你觉得有什么好处和潜在的风险?

我们在 JWT 的 Payload 中放了用户的 userId、角色、组织标签以及主组织标签这四类核心信息。

这种设计简化了整个权限控制的逻辑,并且我们会将用户的组织标签、主标签暂存到 Redis 中,在数据检索时,后端可以直接从缓存中获取用户的组织标签进行 Elasticsearch 查询,非常方便。

存在的潜在风险,我目前能想到的是:如果一个用户有很多组织标签,orgTags 字段可能会变得很长,导致整个 JWT 变得相对庞大,但对于派聪明来说,一般也不会给用户分配太多的组织标签。

5.当一个带有JWT的请求过来后,你的后端是如何进行认证和授权的?具体在Spring Security中,你是如何集成这套JWT校验逻辑的?有没有自定义一些组件,比如过滤器(Filter)?

我们实现了一个名为 JwtAuthenticationFilter 的自定义过滤器,继承自 OncePerRequestFilter,保证每次请求执行一次认证逻辑。

该过滤器会从请求头的 Authorization 字段中提取 JWT,然后对 Token 进行签名校验和过期检查,确保其合法性。

如果 Token 有效,就从中解析出用户的基本信息,如用户名,然后通过从 MySQL 中加载完整的用户信息,包括角色与权限,封装成 UserDetails 对象,再新建一个标准的 UsernamePasswordAuthenticationToken 认证对象,将用户身份与权限信息注入其中。

之后再将该认证对象存入 SecurityContextHolder,也就是 Spring Security 的安全上下文中。到此为止,当前请求的用户身份就算是被正式“登记”了。

一旦过滤器完成了认证并设置了安全上下文,Spring Security 的后续授权机制就会自动生效。当下一次请求过来时,Spring Security 就会从安全上下文中获取当前用户的角色,判断其是否有权限访问请求的 URL。

除了基础的角色权限控制,派聪明还实现了额外的组织标签授权机制。通过另一个自定义过滤器 OrgTagAuthorizationFilter 实现,位于 JWT 认证过滤器之后,用于处理基于“组织标签”的细粒度数据访问控制。

6.请你完整地描述一下:一个普通用户登录后,尝试去访问一个需要特定‘组织标签’才能查看的文件,整个后端处理的全链路流程是怎样的?”

请求过来后,首先由 Spring Security 的过滤器链接管。过滤器链中的 JwtAuthenticationFilter 过滤器会优先执行。负责从请求头中提取出 JWT,校验 Token 是否有效,并解析出用户信息。随后,该过滤器会将认证成功的用户信息包装为 Authentication 对象,注入到 Spring Security 的安全上下文中,完成身份认证。

接下来,Spring Security 会根据 SecurityConfig 中配置的接口访问规则进行角色级别的基础权限校验。如果当前用户身份合法,请求将继续向后传递。

进入业务前,请求还会经过一个自定义的组织标签权限过滤器 OrgTagAuthorizationFilter。这个过滤器专门用来处理与“组织标签”相关的细粒度数据权限。它会从数据库中加载当前用户的组织标签信息,并将这些标签保存在请求上下文中。

等请求进入业务层后,请求最终被路由到搜索模块,系统会构建一条带有权限过滤条件的 Elasticsearch 查询。具体来说,查询会强制加入权限过滤规则,仅返回以下几类文档:

  • 属于用户本人的私有文档(userId匹配);
  • 标记为公开的文档;
  • 属于用户所属组织标签(orgTags)下的文档。

这样一来,即使某个文档本身存在于索引中,但由于当前用户不具备相应的组织标签,在 Elasticsearch 查询阶段,该文档就会被自动过滤掉,不会出现在返回结果中。

7.组织标签的权限模型具体是如何实现的?当一个用户同时拥有多个组织标签时,系统如何处理权限冲突?

在派聪明项目中,我们的权限控制采用了一种 RBAC+组织标签的混合模型,以实现用户和文档之间的权限控制。

首先,系统引入了基于角色的权限控制。并内置了两种角色:普通用户(USER)和管理员(ADMIN)。通过在 SecurityConfig 中配置接口访问规则,不同角色的用户可以访问不同的 API。

在此基础上,我们还设计了基于组织标签的访问权限控制,以实现更细粒度的数据隔离。每个用户可以关联一个或多个组织标签,而用户在上传文档时同样会绑定对应的组织标签。

当用户发起请求时,我们会通过 OrgTagAuthorizationFilter 检查用户的组织标签是否与资源的组织标签是否匹配。

当一个用户拥有多个组织标签时,系统采用以下策略处理权限冲突:

  • 用户只需要拥有资源所需的任何一个组织标签,即可获得访问权限。
  • 对于公开资源,所有用户都可以访问。
  • 对于私有资源,只有资源所有者和管理员可以访问。
  • 对于管理员来说,拥有最高权限,可以绕过组织标签的限制。

8.如果组织结构发生变化(如部门合并、拆分),如何在系统中平滑地处理这种变更而不影响现有权限?

在派聪明系统中,我们是用“组织标签”这种方式来做权限控制的,这本身就为后期的部门合并、拆分预留了比较好的扩展空间。

比如说,公司要把 A 部门和 B 部门合并成一个新事业部,我们可以这样做:

第一步,给新事业部建一个新的“组织标签”。

第二步,把这个新的标签发给 A 和 B 两个部门的所有人,以及他们的资源。这样在过渡期内,A部门、B部门以及新事业部的人,都能正常访问该有的资源。

第三步,标签清理。当业务完全切换到新事业部标签后,再把旧标签安全地删除。

至于怎么让变更后的权限及时生效,我们是通过 Redis 来完成的。当一个用户的组织标发生了变化,我们会把这个用户原有的组织标签清理掉,然后替换为新的组织标签,这样当他重新登录后再次请求资源的时候,就可以匹配上新的组织标签资源。

9.组织标签树的设计考虑了哪些因素?在处理多级组织结构时遇到了哪些挑战,如何解决?

针对组织标签树,我们的设计思路是这样:

给用户和资源都打上“标签”,但标签是可以层级化的。比如 “总公司/事业部/研发组” 这种。

当用户访问资源时,我们会把用户的标签一路向上汇总成一个完整的权限集合,比如他在研发组,那他自动拥有“研发组”、“事业部”、“总公司”这 3 个标签的权限。我们会直接把这个集合放进 JWT 里,Redis 里也会缓存。

这样一来,权限判断就变成了一个简单的集合包含操作,非常快。

我印象最深的挑战:多层组织结构意味着,判断用户是否有权限访问某个资源,理论上要从叶子节点一路向上查到根节点,非常耗时,尤其是在高并发场景下。

我们采用的策略是,当用户第一次访问资源时,把他所属的组织节点及所有父节点的权限标签一次性计算出来,形成一个完整的权限集合,比如 {研发部、事业部A、总部}。这个集合会直接放入 Redis 缓存中,后续再次请求时,就不用再去获取组织权限了,直接从 Redis 中取出来。

10.如何确保JWT Token的安全?在派聪明系统中,Token的生成、验证和刷新机制是怎样设计的?

在派聪明系统中,我们对 JWT 做了多重安全设计。首先,我们使用 HS256 算法给 Token 加签,签名密钥是通过 Base64 编码存储在配置文件中的,token 里只放了用户的必要信息,比如说 userid、角色和组织标签等。

另外,我们还设计了双 token 机制,Access Token 的有效期为 1 个小时Refresh Token 的有效期为 7 天,保证用户体验的同时,大大降低 token 泄露的风险。

当用户登录后,我们会将用户的基本信息存入 JWT 的 Claims,并生成 access token 和 refresh token,access token 的过期时间为 1 小时,refresh token 的过期时间为 7 天,并且将 access token、refresh token 存入 Redis,Redis 的过期时间比 JWT 多 5 分钟缓冲,避免 Redis 提前过期导致验证失败。

JWT 的权限拦截器会对接下来的每一次请求进行 token 验证,这里我们做了双重验证。第一重校验 Redis 缓存中 token 是否在黑名单,是否有效;第二重校验 JWT 中的 token 签名是否正确;验证成功后,再从 Token 中解析出用户信息,并设置到 Spring Security 的上下文中,以便后续的授权操作。

token 的刷新是无感知的自动刷新,在 token 验证成功后,我们会检查 token 的剩余有效期,如果少于 5 分钟,系统会自动进行 token 刷新,生成一个新的 access token;并将新的 token 返回给前端。

此外,我们还设置了一个 10 分钟宽限期,方便刚刚 token 过期的用户也能无感刷新。

11.权限验证流程中,是在哪个环节进行数据访问控制的?实现上有哪些技术要点?

当用户访问资源的时候,我们一共会做三层校验,第一层是 JWT 权限拦截器,负责确认用户是谁,能不能访问我们的系统。

第二层是组织标签拦截器,负责判断用户能不能访问对应的资源,比如说如果资源被标记为公开,或者没有设置组织标签,或者属于默认组织,则直接放行;再比如说如果用户的角色是 ADMIN ,则直接放行。

第三层是在用户进行知识库查询时,我们会根据用户的组织标签,筛选他能够看到的知识库,比如说用户本人只能看到他自己上传的私有文档,不能看到其他用户上传的私有文档。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇