一张表还是两张表大家一般怎么设计前台(app)用户和后台管理员的数据库与权限管理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
varius
V2EX    程序员

一张表还是两张表大家一般怎么设计前台(app)用户和后台管理员的数据库与权限管理?

  •  
  •   varius 2021-02-09 19:38:40 +08:00 4660 次点击
    这是一个创建于 1707 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT 。 在做涉及到 ap/小程序 /前台用户的后台服务时,有两种方案。

    1. 选择把用户和管理员放在一张表,通过角色来 RBAC 来区分。
    2. 把用户和管理员作为不同类型,放在两张表。

    #大家一般偏好哪种方案?

    我的疑惑, 用 1 方案的时候,统一 JWT 鉴权,然后通过角色禁止登陆后台之类嘛? 用 2 方案的时候,会不会不好处理 JWT 之类的。

    20 条回复    2021-02-14 15:31:20 +08:00
    Mitt
        1
    Mitt  
       2021-02-09 19:47:03 +08:00 via iPhone
    如果要分表那么通常情况是前后台分离,不分表的话后台通常和前台同属一个前端项目,需要管理员去前台进行一些操作的,JWT 的话同理,不分离按 rbac 权限禁止登录,分离可以直接划分不同域名或 path 来区分
    liuxey
        2
    liuxey  
       2021-02-09 19:51:04 +08:00
    看产品定位和需求,保不准哪天的需求是管理员也能登录“小程序”用某些功能
    newtype0092
        3
    newtype0092  
       2021-02-09 20:07:09 +08:00
    最好不要混在一起,外部用户表和后台用户表是两回事。
    业务复杂以后可以引入独立的用户服务,外部用户库和后台用户库各自分配不同的 app_id,在用户服务中做统一的处理逻辑。
    varius
        4
    varius  
    OP
       2021-02-09 20:10:59 +08:00
    @Mitt 这种大部分后台和前台都不是一个平台上的了,看来还是分表划算
    varius
        5
    varius  
    OP
       2021-02-09 20:11:16 +08:00
    @liuxey 感觉老哥在暗示某些项目什么的哈哈哈哈
    varius
        6
    varius  
    OP
       2021-02-09 20:11:43 +08:00
    @newtype0092 老哥稳妥!的确这是真正搞微服务的思路
    Mitt
        7
    Mitt  
       2021-02-09 20:19:00 +08:00 via iPhone
    @varius 你对微服务的误解,这只是很普通的前后台,引入微服务只会增加复杂度不会降低耦合度,他俩本来就是耦合在一起的,分表好处是以后还可以再绑起来,只需要一个 via 表
    varius
        8
    varius  
    OP
       2021-02-09 20:23:35 +08:00
    @Mitt 那其实是不是用 JHipster 里提倡的方案,抽象出一个 User,然后管理员一个表,用户一个表,然后用 User 来对应,这样比较好?
    Mitt
        9
    Mitt  
       2021-02-09 21:04:22 +08:00
    @varius #8 这么说吧, 管理员用户对应后台,普通用户对应前台,这俩相互没有交集,如果产生交集,给管理员用户注册一个普通用户账号然后跟管理员用户绑定起来,如果不产生交集那么前后台用户都是独立的
    varius
        10
    varius  
    OP
       2021-02-09 21:13:04 +08:00
    @Mitt THX 指点!
    hsluoyz
        11
    hsluoyz  
    PRO
       2021-02-09 21:42:05 +08:00
    后端用 casbin,前端用 casbin.js ,权限前后端联动
    varius
        12
    varius  
    OP
       2021-02-09 23:36:04 +08:00
    @hsluoyz 这个一直听过,但是没使用过
    GDC
        13
    GDC  
       2021-02-10 08:13:45 +08:00 via iPhone
    @varius 就是他搞的 天天发帖吹 本来好好的项目 看多了也烦
    xuanbg
        14
    xuanbg  
       2021-02-10 08:52:58 +08:00
    一张表足矣。对于鉴权来说,可以对资源进行三个安全等级划分:
    1 、公开,游客可访问
    2 、私有,必须是注册用户且持有有效的 token
    3 、授权,必须是注册用户且持有有效的 token,并获得授权

    以上 3 个等级和用户有一毛钱关系吗?所以根本没有必要区分普通用户和管理员用户。人为区分两种用户,除了把系统复杂化,没有任何的好处。
    newtype0092
        15
    newtype0092  
       2021-02-10 10:01:02 +08:00
    @xuanbg #14 不同意你说的,这不是认为区分两种用户,而是两种用户正常情况本身就是无关的,强行耦合在一起才会有问题。
    用户的查询逻辑一般都是关联用户的业务表的,这种查询大小是会随着用户量增长快速扩张的,后台账号则是关联另一套后台业务表,数据量可能小的多,如果耦合在一起,每次查询某一套业务的时候都要用条件过滤掉另一个类型的账号,这种额外开销是没有意义的。
    newtype0092
        16
    newtype0092  
       2021-02-10 10:11:34 +08:00
    #8 开始时两张表够用,中期通用的逻辑慢慢便多了,再抽出一个和身份无关的通用 User 表,对同一个实际用户的不同身份做关联,再往大做,你的前后两个系统规模都很大了,要做拆分的时候,User 表也就该拆成独立的服务了。

    用户放不放在一个表里,最根本还是看怎么用,比如教育类的 app,老师和学生完全是两个身份,所有查询基本都不通用,那放一个表里就很难受,前端用户和后台用户一般也是这个情况,除非是类似 QQ 空间这种,空间编辑后台本身也是用户功能的一部分,这种就不需要拆分。
    xuanbg
        17
    xuanbg  
       2021-02-10 20:07:54 +08:00
    @newtype0092 没明白为啥要“用条件过滤掉另一个类型的账号”?
    varius
        18
    varius  
    OP
       2021-02-14 15:30:10 +08:00
    @GDC 哈哈哈哈,原来如此~
    varius
        19
    varius  
    OP
       2021-02-14 15:30:51 +08:00
    @xuanbg JHipster 的 concept 是这种意思
    varius
        20
    varius  
    OP
       2021-02-14 15:31:20 +08:00
    @newtype0092 明白,谢谢老哥经验之谈
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5960 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 02:51 PVG 10:51 LAX 19:51 JFK 22:51
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86