V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
v2eb
V2EX  ›  问与答

一个权限设计问题( Java )

  •  
  •   v2eb · 2020-12-20 12:38:01 +08:00 · 1460 次点击
    这是一个创建于 1435 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1 、一个权限设计问题
    用户分为三级权限 ( 省级,市级 ,区县级 )
    省级账号 -> 查看省下所有市的数据
    市级账号 -> 查看市下所有区县的数据
    区县账号 -> 只能查看此区县的账号

    客户需求:在省级账号下,登录的用户只能查看部分授权过的市

    2 、一个 excel 导出问题
    excel 表头例子:
    用户基本信息 1,用户基本信息 1,用户一对多 1(字段 1),用户一对多 1(字段 2),用户一对多 2(字段 1),用户一对多 2(字段 2)
    说明:
    1 、excel 表头包含基本信息(50 个字段左右),一对多字段(50+字段)
    2 、(用户一对多 1 ) 视为一个整体
    客户需求:自定义导出字段
    问题:怎么写优雅,代码量少,能复用就更好了
    5 条回复    2020-12-21 09:10:08 +08:00
    johnsona
        1
    johnsona  
       2020-12-20 15:38:42 +08:00 via iPhone
    rbac1 或许是,要什么复用?赶紧复制粘贴晚下班了
    kidlj
        2
    kidlj  
       2020-12-20 15:38:46 +08:00
    建一个 tenant 表用于权限控制,和 user 表是 one2many 的关系,每个级别的用户都有一个对 tenant 。tenant 表内,每个 tenant 和下属级别 tenant 又是一对多的关系(加一个字段 parent_id, 因为是同一个类型,所以是构成的拓扑结构是树状的,参考 https://entgo.io/docs/schema-edges/#o2m-same-type )。省级的 tenant 是 root,没有 parent,但可以添加市级的 children,市级的 tenant 又可以添加区县级的 children,如此一来构成一棵树,还能方便地查询出任一个 tenant 的 children 。添加 children 通过为下属 tenant 设置 parent_id 到上级区域的 tenant id 来完成。

    User 创建的数据都可以和 tenant 联系起来。比如通过一个省级的用户,查到他的 tenant,再通过这个 tenant id 查到下属 tenant,进而可以查到这些 tenants 对应的 users,以及属于这些 users 的数据。当然,这是最简单的情形,省级用户可以看到所有市级和区县级用户的数据,如果还要求省级用户只看到部分授权的市级用户的数据,可以在 tenant 表再建一个 tenant 到 tenant 的一对多关系(加一个字段 managed_by_id ),这时候添加授权也是表现为对一个 tenant 添加 children,具体的数据库操作表现为为下属区域 tenant (被授权查看)设置 managed_by_id 到上级 tenant id 。不过添加 children 之前还需要验证下属被管理的 tenant 是否已经指向了上级管理 tenant 的 id,如果没有,说明这不是一个合规操作。

    如果要查询一个上级 tenant 的所有下属的数据,就通过 parent_id 来遍历树。如果要查询一个上级 tenant 的已授权的的下属的数据,通过 managed_by_id 来遍历树。

    Go 的 ORM Ent. 内建这种 policy 支持,可以作为参考: https://entgo.io/docs/privacy/
    kidlj
        3
    kidlj  
       2020-12-20 16:01:21 +08:00
    @kidlj 上边的设计不对 😅。不需要 tenant 表,parent_id 和 managed_by_id 在 user 表维护就可以了。
    tangkaichuan
        4
    tangkaichuan  
       2020-12-20 17:16:50 +08:00 via Android
    Excel 导出或许可以用 easyexcel 的动态头写入 https://www.yuque.com/easyexcel/doc/write
    w292614191
        5
    w292614191  
       2020-12-21 09:10:08 +08:00
    部门树设计好结构,然后业务中保存部门代码。
    10 省
    101001 市
    101001001 区县

    查询省级 like 10%,查询市级 like 10100%。

    在建立一个登录人员和部门的中间表。需要授权的就勾进来。sql 或程序区分。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6045 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:34 · PVG 10:34 · LAX 18:34 · JFK 21:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.