网关鉴权设计

386 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情

每日英语:

Jealousy is the grave of affection.

嫉妒是感情的坟墓。 -玛丽·贝克·安迪

1 网关鉴权设计

网关鉴权涉及的内容比较多,我们来分析一下:

1:身份识别:这里的身份识别是指用户登录信息识别,很久以前用Session,而微服务用JWT令牌。
2:身份鉴权:用户是否有权限访问当前指定方法。
3:鉴权位置:微服务网关中鉴权,还是在每个微服务鉴权。
4:鉴权类型:
    a)功能权限
    b)数据权限,复杂系数非常高,适合金融系统或者大型ERP系统

1.1 网关鉴权设计

用户鉴权方式有多种,可以在每个服务之间进行鉴权,也可以在微服务网关进行鉴权,如果在各个服务之间进行鉴权,效率会非常低,如果在微服务网关鉴权,就需要把暴露的端口控制好,只暴露微服务网关端口,其他端口一律不允许直接访问。很明显微服务网关鉴权效率最高、最实用,如下图:

1612108997212.png

基于微服务网关鉴权流程:

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令牌。