1) 【一句话结论】采用基于角色的访问控制(RBAC)模型,结合服务端核心权限校验,客户端辅助验证,并通过令牌绑定、操作日志审计等手段防止权限绕过,确保不同角色(HR、求职者、管理员)按权限操作。
2) 【原理/概念讲解】基于角色的访问控制(RBAC)的核心是用户-角色-权限的分层关系:
- 用户属于一个或多个角色(如HR属于“招聘经理”角色,求职者属于“求职者”角色);
- 角色关联一组权限(HR有“查看/发布职位”“审核简历”等权限,求职者只有“投递简历”权限);
- 用户通过角色间接获得权限,而非直接分配权限。
类比:就像公司里的“职位(角色)”对应“工作权限(权限)”,员工(用户)根据职位获得权限。RBAC的优势是简化权限管理,通过角色作为中间层,避免直接维护用户与权限的复杂关系。
3) 【对比与适用场景】
| 模型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|
| RBAC | 基于角色的访问控制,用户通过角色获得权限 | 角色是权限的集合,用户绑定角色 | 企业内部系统(如招聘系统、OA)、需要角色分层的系统 | 需要合理设计角色,避免权限冗余或遗漏 |
| ABAC(属性基访问控制) | 权限由用户属性、资源属性、环境属性动态决定 | 权限动态计算,更灵活 | 需求频繁变化的系统(如云资源访问)、敏感数据访问 | 实现复杂,计算开销大 |
4) 【示例】(伪代码+请求示例)
- 权限表设计:
- 用户表(user_id, username, password)
- 角色表(role_id, role_name)
- 权限表(permission_id, permission_name)
- 用户-角色关联表(user_role, user_id, role_id)
- 角色-权限关联表(role_permission, role_id, permission_id)
- 登录流程:用户登录后,服务端生成包含角色和权限的JWT令牌(如
eyJ...roles=["hr","admin"],permissions=["viewJob","publishJob"])。
- 请求校验示例:
当HR请求“查看职位”时,服务端校验令牌中的角色(“hr”)是否包含“viewJob”权限,通过则返回职位列表,否则返回403错误。
5) 【面试口播版答案】
面试官您好,针对招聘管理系统的权限控制,我会采用基于角色的访问控制(RBAC)模型。首先,权限模型上,定义角色(如HR、求职者、管理员),每个角色关联权限(HR有查看/发布职位、审核简历;求职者只有投递简历)。用户登录后,服务端生成包含角色和权限的令牌,客户端存储令牌。请求时,服务端校验令牌中的角色和权限,比如HR请求查看职位,服务端验证角色为HR且权限包含“viewJob”,通过则返回数据。为了防止权限绕过,采用服务端核心校验(避免客户端伪造请求),令牌绑定用户身份(防止令牌泄露后滥用),并记录操作日志,定期审计。这样既能保证不同角色按权限操作,又能防止攻击。
6) 【追问清单】
- 问:权限表如何设计?
回答要点:设计三张核心表(用户表、角色表、权限表)及中间关联表(用户-角色、角色-权限),通过中间表实现灵活的权限分配(如HR加入“招聘经理”角色,自动获得对应权限)。
- 问:如果角色权限需要动态调整,如何处理?
回答要点:在角色表中维护权限列表,当HR修改职位发布权限时,更新角色-权限关联表,系统重新校验令牌中的权限,或令牌包含权限列表,动态更新。
- 问:客户端如何辅助校验?
回答要点:前端验证令牌的签名(如JWT的HMAC签名)和过期时间,若令牌无效或过期,提示用户重新登录,避免直接发送非法请求。
- 问:如何防止权限绕过?
回答要点:服务端校验所有关键操作(如投递简历、审核简历),不依赖客户端参数;使用HTTPS防止中间人攻击;日志记录异常操作,便于追踪。
- 问:RBAC的扩展性如何?
回答要点:新增角色(如“面试官”)时,只需在角色表中添加新角色并关联权限,用户加入该角色后自动获得权限,无需修改用户表。
7) 【常见坑/雷区】
- 坑1:仅做客户端校验,服务端未校验,导致前端伪造令牌绕过权限。
- 坑2:权限表设计不合理,角色与权限关联混乱,导致HR误操作求职者权限。
- 坑3:忘记防绕过措施,如未记录操作日志,无法追踪权限滥用。
- 坑4:令牌不绑定用户身份,导致令牌泄露后攻击者冒充用户。
- 坑5:权限校验点遗漏,业务逻辑中直接判断用户是否为HR,绕过服务端校验。