用户权限

用户权限管理模块设计

Posted by Liangjf on October 4, 2019

用户权限管理模块设计

在所有web,app,后台管理系统等,都会有一个用户权限管理模块。一个用户权限管理系统,主要包括三个元素:账号、角色、权限。

用户权限管理模块的设计思路:一个用户可以绑定多个角色,一个角色有多个权限,一个权限对应一个权限信息。如图所示: 用户权限管理

用户权限一般涉及四张表

  • tb_user(用户表)
  • tb_role(角色表)
  • tb_role_privilege(角色权限关联表)
  • tb_catalog(权限信息表)

先看看四张表具有哪些字段吧(这里列出的是核心字段,真正应用时根据自己需要添加额外的字段即刻)

用户表

  • 保存用户的账号,密码,电话,是否可用,登录时间,角色id等。其中和用户权限相关的是角色id。

      CREATE TABLE `tb_user` (
        `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',
        `username` varchar(100) NOT NULL COMMENT '账号',
        `password` varchar(32) DEFAULT NULL COMMENT '密码',
        `user_phone` varchar(20) DEFAULT NULL COMMENT '电话',
        `is_available` tinyint(1) DEFAULT '1' COMMENT '是否可用',
        `login_time` datetime DEFAULT NULL COMMENT '登录时间',
        `role_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '角色id',
        PRIMARY KEY (`id`),
        UNIQUE KEY `username` (`username`)
      ) ENGINE=InnoDB COMMENT='用户表'
    

角色表

  • 每个角色的信息。(在添加角色时会新增一条记录入库)

      CREATE TABLE `tb_role` (
        `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',
        `role_name` varchar(50) DEFAULT NULL COMMENT '角色名称',
        `is_available` tinyint(1) DEFAULT '1' COMMENT '是否可用',
        `add_time` datetime DEFAULT NULL COMMENT '添加时间',
        PRIMARY KEY (`id`),
        UNIQUE KEY `role_code` (`role_code`)
      ) ENGINE=InnoDB COMMENT='角色表'
    

角色权限关联表

  • 把角色和权限关联起来,用户拥有角色id,相当于拥有这个角色id对应所有的权限。

      CREATE TABLE `tb_role_privilege` (
        `cat_id` int(10) DEFAULT NULL COMMENT '菜单选项ID',
        `role_id` int(10) DEFAULT NULL COMMENT '角色ID',
        KEY `role_id` (`role_id`),
        CONSTRAINT `tb_role_privilege_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `tb_role` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
      ) ENGINE=InnoDB COMMENT='角色权限关联表'
    

角色权限关联表和角色表具有联级删除约束,主要是方便角色删除了,对应的角色权限也从权限表删除。

权限信息表

  • 权限信息表其实就是把整个系统的各个模块的权限描述,是整个系统的选项化。

      CREATE TABLE `tb_catalog` (
        `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',
        `cat_name` varchar(50) DEFAULT NULL COMMENT '名称',
        `cat_code` varchar(100) DEFAULT NULL COMMENT '权限码 用于搜索索引',
        `pid` int(10) DEFAULT '0' COMMENT '父ID',
        `avoid_check` tinyint(1) DEFAULT '0' COMMENT '1.不需要检查,0需要检查',
        PRIMARY KEY (`id`),
        UNIQUE KEY `cat_code` (`cat_code`),
        KEY `pid` (`pid`)
      ) ENGINE=InnoDB COMMENT='权限信息表'
    

为什么要分为四个表?

解耦

主要是为了拓展性强,维护性高;为了整个权限控制管理模块解耦。

复用性

添加用户和添加角色时是没有耦合在一起的,角色和权限是没有耦合在一起的。比如,在添加用户时直接选择一种角色即刻; 在添加权限时,不用考虑角色是啥,在创建角色时直接选择想要的权限进行绑定即刻。提高了各个模块的复用性。

实现要点。

1、权限接口:

  • Add(增加一条权限(比如app的评论功能))
  • Delete(删除一条权限)
  • Update(更新一条权限)
  • List(获取所有的权限)
  • GetRoleTree(根据请求的表单角色id获取对应所有的权限)

2、角色接口:

  • Add(增加一个角色(比如管理员,开发者))
  • Delete(删除角色)
  • Update(更新角色,信息或者权限)
  • List(获取所有的角色)
  • AssignPrivilege(分配角色权限。就是把角色和所有分配的权限id绑定入库[tb_role_privilege])

3、用户接口:

  • Add(增加一个用户。此时会绑定角色,前端提供选择角色,并通过表单和用户信息一起传到后台)
  • Delete(删除用户)
  • Update(更新用户)
  • List(获取所有的用户)
  • Login(登录。判断是否有此用户?密码是否正确?校验角色是否能登录?把一些重要信息存session,方便后面的接口请求校验权限)
  • Logout(退出。删除session信息)

4、登录后的操作接口:

  • 中间件拦截请求,做一些校验逻辑
  • 通过session拿到此用户的信息,判断是否已登录
  • 校验用户的权限是否有权限操作此次请求的模块功能。(通过session的roleid获取对应的权限和此次请求的页面url或访问路径【权限信息表的cat_code】)