从0到1手撕鉴权系统架构(二)-- 公共权限架构

1,051 阅读4分钟

鉴权设计

鉴权基础表

  1. 服务表
  2. 用户表
  3. 角色表
  4. 菜单表
  5. 功能表
  6. 资源表

柠檬额外表

  1. 子角色表

鉴权关联表

  1. 用户-角色,多对多,超管代码控制。
  2. 角色-菜单,多对多,数据库关联表。
  3. 角色-功能,多对多,数据库关联表。
  4. 菜单-功能,多对多,数据库关联表。
  5. 功能-资源,多对多,数据库关联表。
  6. 服务-其他所有表,服务id存于其他个表 service_id。

柠檬额外表

  1. 商户-子角色表
  2. 用户-子角色表
  3. 子角色-菜单表
  4. 子角色-功能

图为RBAC示例,原理相通。 image.png

登陆

每个登陆的用户会使用 jwt 生成一个 token,未做缓存设计。
详见 com.zuhao.uhaozutool.service.UserService.login。

鉴权

每个菜单有固定的 url 前缀,功能有固定的 method:url。
由此可以根据访问的 URL 判断当前用户是否有权限访问。
获取当前登陆人,根据用户查询是否有访问此 URL 权限。
例:com.zuhao.uhaozutool.base.authorize.UserAuthorize image.png

注解

  • @Auth 可使用于类、方法,此注解决定使用哪种 Authorize 做鉴权逻辑。
  • @Authorize 实现 handle 方法,coding 具体鉴权逻辑。
  • @Ignore 用户已被 @Auth 注解的类,部分方法不需要鉴权。

基础功能点

image.png

建表语句


DROP TABLE IF EXISTS `t_base_auth_service`;
CREATE TABLE `t_base_auth_service`
(
    `id`                 BIGINT(11)    NOT NULL AUTO_INCREMENT COMMENT '主键',
    `name`               VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '账号',
    `description`        VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '描述',
    `if_available`       TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '启用状态,1启用,2禁用',
    `created_time`       DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `last_modified_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  ROW_FORMAT = COMPACT COMMENT ='服务表';

DROP TABLE IF EXISTS `t_base_auth_role`;
CREATE TABLE `t_base_auth_role`
(
    `id`                 BIGINT(11)    NOT NULL AUTO_INCREMENT COMMENT '主键',
    `service_id`         BIGINT(11)    NOT NULL DEFAULT 0 COMMENT '服务id',
    `name`               VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '角色名称',
    `sign`               VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '角色标志',
    `description`        VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '描述',
    `if_available`       TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '启用状态,1启用,2禁用',
    `sort`               TINYINT(4)    NOT NULL DEFAULT 0 COMMENT '排序',
    `created_time`       DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `last_modified_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  ROW_FORMAT = COMPACT COMMENT ='角色表';

DROP TABLE IF EXISTS `t_base_auth_role_menu`;
CREATE TABLE `t_base_auth_role_menu`
(
    `id`                 BIGINT(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `role_id`            BIGINT(11) NOT NULL DEFAULT 0 COMMENT '角色id',
    `menu_id`            BIGINT(11) NOT NULL DEFAULT 0 COMMENT '菜单id',
    `created_time`       DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `last_modified_time` DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  ROW_FORMAT = COMPACT COMMENT ='角色-菜单表';

DROP TABLE IF EXISTS `t_base_auth_menu`;
CREATE TABLE `t_base_auth_menu`
(
    `id`                 BIGINT(11)    NOT NULL AUTO_INCREMENT COMMENT '主键',
    `service_id`         BIGINT(11)    NOT NULL DEFAULT 0 COMMENT '服务id',
    `parent_id`          BIGINT(11)    NOT NULL DEFAULT 0 COMMENT '父id',
    `name`               VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '菜单名称',
    `sign`               VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '角色标志',
    `url_prefix`         VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '链接前缀',
    `level`              TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '层级',
    `if_has_child`       TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '是否有下一层级',
    `description`        VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '描述',
    `if_available`       TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '启用状态,1启用,2禁用',
    `sort`               TINYINT(4)    NOT NULL DEFAULT 0 COMMENT '排序',
    `created_time`       DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `last_modified_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  ROW_FORMAT = COMPACT COMMENT ='菜单表';

DROP TABLE IF EXISTS `t_base_auth_role_function`;
CREATE TABLE `t_base_auth_role_function`
(
    `id`                 BIGINT(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `role_id`            BIGINT(11) NOT NULL DEFAULT 0 COMMENT '父id',
    `function_id`        BIGINT(11) NOT NULL DEFAULT 0 COMMENT '父id',
    `created_time`       DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `last_modified_time` DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  ROW_FORMAT = COMPACT COMMENT ='角色-功能表';

DROP TABLE IF EXISTS `t_base_auth_function`;
CREATE TABLE `t_base_auth_function`
(
    `id`                 BIGINT(11)    NOT NULL AUTO_INCREMENT COMMENT '主键',
    `service_id`         BIGINT(11)    NOT NULL DEFAULT 0 COMMENT '服务id',
    `menu_id`            BIGINT(11)    NOT NULL DEFAULT 0 COMMENT '父id',
    `sign`               VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '方法标志',
    `name`               VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '功能名称',
    `description`        VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '描述',
    `if_available`       TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '启用状态,1启用,2禁用',
    `created_time`       DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `last_modified_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  ROW_FORMAT = COMPACT COMMENT ='功能表';

DROP TABLE IF EXISTS `t_base_auth_function_resource`;
CREATE TABLE `t_base_auth_function_resource`
(
    `id`                 BIGINT(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    `function_id`        BIGINT(11) NOT NULL DEFAULT 0 COMMENT '功能id',
    `resource_id`        BIGINT(11) NOT NULL DEFAULT 0 COMMENT '资源id',
    `created_time`       DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `last_modified_time` DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  ROW_FORMAT = COMPACT COMMENT ='功能-资源表';

DROP TABLE IF EXISTS `t_base_auth_resource`;
CREATE TABLE `t_base_auth_resource`
(
    `id`                 BIGINT(11)    NOT NULL AUTO_INCREMENT COMMENT '主键',
    `service_id`         BIGINT(11)    NOT NULL DEFAULT 0 COMMENT '服务id',
    `url`                VARCHAR(64)   NOT NULL DEFAULT '' COMMENT '后端路径,method:url格式',
    `description`        VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '描述',
    `if_available`       TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '启用状态,1启用,2禁用',
    `created_time`       DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `last_modified_time` DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
  ROW_FORMAT = COMPACT COMMENT ='资源表';
  
柠檬额外表