开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
每日英语:
Jealousy is the grave of affection.
嫉妒是感情的坟墓。 -玛丽·贝克·安迪
1 网关鉴权设计
网关鉴权涉及的内容比较多,我们来分析一下:
1:身份识别:这里的身份识别是指用户登录信息识别,很久以前用Session,而微服务用JWT令牌。
2:身份鉴权:用户是否有权限访问当前指定方法。
3:鉴权位置:微服务网关中鉴权,还是在每个微服务鉴权。
4:鉴权类型:
a)功能权限
b)数据权限,复杂系数非常高,适合金融系统或者大型ERP系统
1.1 网关鉴权设计
用户鉴权方式有多种,可以在每个服务之间进行鉴权,也可以在微服务网关进行鉴权,如果在各个服务之间进行鉴权,效率会非常低,如果在微服务网关鉴权,就需要把暴露的端口控制好,只暴露微服务网关端口,其他端口一律不允许直接访问。很明显微服务网关鉴权效率最高、最实用,如下图:
基于微服务网关鉴权流程:
1:Service_Permission实现权限更新操作
2:Canal监听MySQL中权限变更日志,并将变更数据同步到Redis
3:Gateway拦截用户所有请求,在Gateway中加载Redis里用户的权限
4:在Gateway中加载权限后,对当前用户请求操作进行权限判断
5:如果有权限,则放行,没有权限,则拦截
1.2 网关鉴权表结构设计
如果要做一套实用的鉴权系统,我们需要设计一套权限表,权限表涉及权限资源表、角色表、角色授权表。
权限资源表:permission
CREATE TABLE `permission` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`source_name` varchar(20) NOT NULL COMMENT '权限名字',
`url` varchar(200) NOT NULL COMMENT '权限访问地址,支持通配符',
`url_match` int(1) NOT NULL COMMENT '匹配方式:0 完全匹配 1 通配符匹配',
`service_name` varchar(100) NOT NULL COMMENT '服务名字',
`method` varchar(10) NOT NULL COMMENT 'GET/POST/PUT/OPTIONS/DELETE/*',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
角色信息表:role_info
CREATE TABLE `role_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_name` varchar(20) NOT NULL,
`description` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
角色授权表:role_permission
CREATE TABLE `role_permission` (
`pid` int(11) NOT NULL,
`rid` int(11) NOT NULL,
PRIMARY KEY (`pid`,`rid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
总结
本篇主要讲述了一下网关鉴权的整体设计,还有网关鉴权表结构设计。下一篇主要介绍一下JWT令牌。