黑名单功能实现

本贴最后更新于 190 天前,其中的信息可能已经沧海桑田

原文:www.yuque.com/snab/mallc...

前言

作为一个聊天网站,最重要的就是言论的约束。如果跑进来一个小黑子,发出一些不恰当的言论,必须要有应对的方案,因此,我们采用了两种手段来进行约束,分别是撤回拉黑

权限设计

拉黑功能是管理员专属的功能。为了前后端能够识别管理员,我们还需要专门设计一套权限管理系统。

传统的权限设计应该是这样的:

  1. 一个用户可以有多个角色
  2. 一个角色对应多种权限
  3. 权限包含多种资源,比如接口,按钮,菜单

最后整合起来,就是用户有多少资源,来判断用户能否访问。角色只是个桥梁。

image

  • RBAC 权限模型1

RBAC 权限模型更多用于 B 端项目,对于 C 端来说,权限没有到那么复杂的级别。

因此,在 抹茶 中,权限系统设计到“角色”层级就够了。

image

我们设置了两个角色,超管拥有所有权限(撤回和拉黑),抹茶管理员有用撤回的权限

论文设计

写论文的时候直接写 RBAC 权限模型1,反正项目代码这么多,我说是“RBAC”那就是 RBAC

拉黑设计

存储结构

首先需要设计一张通用的黑名单表。拉黑的目标类型可以是 ip,uid,设备号等,可以用一个 type 来表示。

target 就是具体的目标值。构建(type+target)的联合索引。

https://drawsql.app/teams/-328/diagrams/-4

image

image

一个用户能有多个角色,一个角色也能属于多个用户,因此抽出了一张用户角色表

拦截时间点

通过拦截器,对每一个接口的请求进行黑名单的拦截。

数据源

黑名单是一个相对静态的数据,并且需要比较实时的判断,可以将它 ​缓存 ​​在 redis 里。对于单机来说,也能缓存在本地内存里。

实现细节

1. 返回角色信息

com.abin.mallchat.custom.user.service.WebSocketService#authorize
首先在用户认证的时候,需要给前端返回用户所属的角色

image

2. 管理员拉黑

com.abin.mallchat.custom.user.controller.UserController#black

  1. 权限判断

    1. 先判断操作者是否拥有某个角色的权限
    2. image
  2. 用户拉黑

    1. 将对应用户的信息入库
  3. 发出拉黑事件

    1. 清除相关缓存,让拉黑产生的效果立即生效
    2. 对该用户所有的信息进行删除
    3. 给所有用户推送拉黑用户的消息

3. websocket 推送拉黑消息

拉黑一般是某些用户进行了不恰当的发言。这时候需要立马通知到所有在线用户。前端接收到拉黑通知,会对消息列表和成员列表对拉黑的 uid 进行匹配,把该 uid 的所有消息从前端缓存中删除。

4. 拉黑用户拦截

被拉黑的用户以后再也没法访问该网站了。

com.abin.mallchat.custom.common.intecepter.BlackInterceptor

在拦截器中,从内存取出所有的黑名单列表 Set,对请求者的 ip 和 uid 进行匹配。如果存在,就拒绝访问。

总结

看完该文章,基本能对一个拉黑功能有个大致的了解

  1. 拉黑的按钮权限涉及到权限控制
  2. 通用的拉黑表结构设计,以及缓存
  3. 拉黑禁止访问的拦截点,是拦截器,用 set 缓存加速判断
  4. 以及拦截的时候 uid 和 ip 的来源(token 解析和 ip 收集进请求上下文 RequestHolder)


  1. RBAC 权限模型

    RBAC 权限模型(Role-Based Access Control)即:基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。

    image-20211222110249727.png

    • 一个角色就可以理解为:一个 “权限组”

    • 用户是不知道数量的,但是角色是固定的,只需要将新用户对应到某个角色即可!!

      • 一个用户可拥有多个角色
      • 角色也会有多种权限

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...