鉴权设计
鉴权基础表
- 服务表
用户表- 角色表
- 菜单表
- 功能表
- 资源表
柠檬额外表
- 子角色表
鉴权关联表
用户-角色,多对多,超管代码控制。- 角色-菜单,多对多,数据库关联表。
- 角色-功能,多对多,数据库关联表。
- 菜单-功能,多对多,数据库关联表。
- 功能-资源,多对多,数据库关联表。
- 服务-其他所有表,服务id存于其他个表 service_id。
柠檬额外表
- 商户-子角色表
- 用户-子角色表
- 子角色-菜单表
- 子角色-功能
图为RBAC示例,原理相通。
登陆
每个登陆的用户会使用 jwt 生成一个 token,未做缓存设计。
详见 com.zuhao.uhaozutool.service.UserService.login。
鉴权
每个菜单有固定的 url 前缀,功能有固定的 method:url。
由此可以根据访问的 URL 判断当前用户是否有权限访问。
获取当前登陆人,根据用户查询是否有访问此 URL 权限。
例:com.zuhao.uhaozutool.base.authorize.UserAuthorize
注解
- @Auth 可使用于类、方法,此注解决定使用哪种 Authorize 做鉴权逻辑。
- @Authorize 实现 handle 方法,coding 具体鉴权逻辑。
- @Ignore 用户已被 @Auth 注解的类,部分方法不需要鉴权。
基础功能点
建表语句
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 ='资源表';
柠檬额外表