MST
星途 面试题库

面试题:Redis频道订阅中如何通过设置用户角色来实现安全访问控制

在Redis频道订阅场景下,假设存在不同权限需求的用户,如普通用户只能订阅公开频道,管理员用户可订阅所有频道。请阐述如何通过设置用户角色来实现这种安全访问控制,以及涉及到的Redis相关操作和数据结构。
20.5万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

实现方式

  1. 定义用户角色:在系统中明确区分普通用户和管理员用户两种角色。
  2. 权限关联:将角色与频道订阅权限关联起来,普通用户关联公开频道,管理员用户关联所有频道。

Redis相关操作与数据结构

  1. 频道管理
    • 数据结构:可以使用Redis的集合(Set)来存储频道信息。例如,使用一个名为all_channels的Set存储所有频道名称。公开频道可以存储在一个名为public_channels的Set中。
    • 操作
      • 添加频道:使用SADD all_channels <channel_name>将新频道添加到所有频道集合,对于公开频道使用SADD public_channels <channel_name>
  2. 用户角色与权限管理
    • 数据结构:使用哈希表(Hash)来存储用户角色信息。例如,user_role:{user_id}的Hash结构,其中role字段的值为adminuser,分别表示管理员和普通用户。
    • 操作
      • 设置用户角色:HSET user_role:{user_id} role admin设置用户为管理员角色,HSET user_role:{user_id} role user设置为普通用户角色。
  3. 订阅控制
    • 数据结构:当用户订阅频道时,可以使用有序集合(Sorted Set)来记录订阅关系。例如,subscriptions:{user_id}的Sorted Set,成员为频道名称,分数可用于记录订阅时间等信息(如果有需要)。
    • 操作
      • 普通用户订阅:
        • 先通过HGET user_role:{user_id} role获取用户角色,确认是普通用户后,使用SMISMEMBER public_channels <channel_name>检查频道是否为公开频道,若是则使用ZADD subscriptions:{user_id} <score> <channel_name>进行订阅。
      • 管理员用户订阅:
        • 通过HGET user_role:{user_id} role确认是管理员角色后,直接使用ZADD subscriptions:{user_id} <score> <channel_name>订阅任意频道,因为管理员可订阅所有频道。