前言
作为一个聊天网站,最重要的就是言论的约束。如果跑进来一个小黑子,发出一些不恰当的言论,必须要有应对的方案,因此,我们采用了两种手段来进行约束,分别是撤回和拉黑
权限设计
拉黑功能是管理员专属的功能。为了前后端能够识别管理员,我们还需要专门设计一套权限管理系统。
传统的权限设计应该是这样的:
- 一个用户可以有多个角色
- 一个角色对应多种权限
- 权限包含多种资源,比如接口,按钮,菜单
最后整合起来,就是用户有多少资源,来判断用户能否访问。角色只是个桥梁。
- RBAC 权限模型1
RBAC 权限模型更多用于 B 端项目,对于 C 端来说,权限没有到那么复杂的级别。
因此,在 抹茶 中,权限系统设计到“角色”层级就够了。
我们设置了两个角色,超管拥有所有权限(撤回和拉黑),抹茶管理员有用撤回的权限
论文设计
写论文的时候直接写 RBAC 权限模型1,反正项目代码这么多,我说是“RBAC”那就是 RBAC
拉黑设计
存储结构
首先需要设计一张通用的黑名单表。拉黑的目标类型可以是 ip,uid,设备号等,可以用一个 type 来表示。
target 就是具体的目标值。构建(type+target)的联合索引。
https://drawsql.app/teams/-328/diagrams/-4
一个用户能有多个角色,一个角色也能属于多个用户,因此抽出了一张用户角色表
拦截时间点
通过拦截器,对每一个接口的请求进行黑名单的拦截。
数据源
黑名单是一个相对静态的数据,并且需要比较实时的判断,可以将它 缓存
在 redis 里。对于单机来说,也能缓存在本地内存里。
实现细节
1. 返回角色信息
com.abin.mallchat.custom.user.service.WebSocketService#authorize
首先在用户认证的时候,需要给前端返回用户所属的角色
2. 管理员拉黑
com.abin.mallchat.custom.user.controller.UserController#black
-
权限判断
- 先判断操作者是否拥有某个角色的权限
-
-
用户拉黑
- 将对应用户的信息入库
-
发出拉黑事件
- 清除相关缓存,让拉黑产生的效果立即生效
- 对该用户所有的信息进行删除
- 给所有用户推送拉黑用户的消息
3. websocket 推送拉黑消息
拉黑一般是某些用户进行了不恰当的发言。这时候需要立马通知到所有在线用户。前端接收到拉黑通知,会对消息列表和成员列表对拉黑的 uid 进行匹配,把该 uid 的所有消息从前端缓存中删除。
4. 拉黑用户拦截
被拉黑的用户以后再也没法访问该网站了。
com.abin.mallchat.custom.common.intecepter.BlackInterceptor
在拦截器中,从内存取出所有的黑名单列表 Set,对请求者的 ip 和 uid 进行匹配。如果存在,就拒绝访问。
总结
看完该文章,基本能对一个拉黑功能有个大致的了解
- 拉黑的按钮权限涉及到权限控制
- 通用的拉黑表结构设计,以及缓存
- 拉黑禁止访问的拦截点,是拦截器,用 set 缓存加速判断
- 以及拦截的时候 uid 和 ip 的来源(token 解析和 ip 收集进请求上下文 RequestHolder)
RBAC 权限模型
RBAC 权限模型(Role-Based Access Control)即:基于角色的权限控制。这是目前最常被开发者使用也是相对易用、通用权限模型。
-
一个角色就可以理解为:一个 “权限组”
-
用户是不知道数量的,但是角色是固定的,只需要将新用户对应到某个角色即可!!
- 一个用户可拥有多个角色
- 角色也会有多种权限
-
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于