在gin中如何设计权限系统

835 阅读2分钟

1.权限库表的设计

说明:以下几个表是权限库表的核心内容,此处省去了创建时间,修改时间之类的字段,只做核心设计。另外补充表是为了让整体权限系统的数据更具维护性而做的添加。

设计思路:所有用户基于角色进行控制,只有角色才有资源和权限的设置权利。杜绝单独对用户进行权限资源控制,原因很简单,这里不作赘述。在前端UI交互时,可加入角色权限资源克隆的功能。

graph TD
Start --> 用户登录 -->获取用户权限数据和用户的资源数据-->gin中间件判断当前用户是否拥有某个请求权限

对于前端的界面,路由,控件等,可作为资源的形式存入权限系统中。用户登录后一次性加载,对于要进行判断的地方,直接通过v-if 等进行控制。

1.1 角色表

字段含义
id主键
name角色名
des描述信息

1.2 用户的角色表

字段含义
id主键
uid用户id
rid角色id

1.3 权限表

字段含义说明
id主键
mid模块id
name权限名称
route_path路由路径唯一,gin context.FullPath()
des描述信息

1.4 角色的权限

字段含义
id主键
pid权限id
rid角色id

1.6 补充表--模块,相当于权限的容器

字段含义
id主键
name模块名称
pid上级模块id
des描述信息

1.7 补充表--操作记录表

字段含义
id主键
uid用户id
content操作内容

1.8 资源表,用于前端展示使用

字段含义说明
id主键
type_id类型id
name资源名称唯一
des描述信息

1.9 资源类别表,用于前端展示使用

字段含义说明
id主键
name类型名称

1.10 角色的资源表

字段含义
id主键
role_id角色id
rid资源id

2.权限的刷新,判断,性能等问题

我们所有的系统不可能再纯粹的单体,所以redis+本地内存的二级缓存形式,我们通常想到的手段。本地内存的刷新可用直接采用pub/sub的模式进行刷新,当然也有类似的框架包来解决这一问题。

gin的中间件在拦截到请求时,可以通过context.FullPath()拿到当前所使用的路由,而这正好是权限表中配好的 route_path的内容,这一切就正好串联起来了。

3.二级缓存的使用推荐

github.com/viney-shih/…