Bumblebee服务网关之统一请求验证

对于微服务网关来讲,统一请求验证是一个比较重要和经常使用的功能,经过网关验证后台服务就无须关注请求验证;对于多语言平台的服务而言制定验证方式和变动验证配置都是一件比较繁琐和工做量大的事情。Bumblebee提供JWT验证插件,只须要简单配置便可让网关实现请求统一验证。mysql

引用插件

Bumblebee中使用JWT须要引用两个插件,分别是Bumblebee.ConfigurationBumblebee.Jwt。加载启动后就能够经过管理工具进行插件配置.git

            g = new Gateway();
            g.HttpOptions(
                o =>
                {
                    o.Port = 80;
                    o.LogToConsole = true;
                    o.LogLevel = BeetleX.EventArgs.LogType.Error;
                });
            g.Open();
            g.LoadPlugin(
                typeof(Bumblebee.Configuration.Management).Assembly,
                typeof(Bumblebee.Jwt.JwtPlugin).Assembly
               );

若是不想本身编写代码能够下载编译的运行包 Bumblebee1.0.6这个版本已经加入了JWTgithub

插件管理

运行程序后进行配置管理工具的插件管理页面,能够看到JWT插件,默认是未启用。web

 

数据库配置

Bumblebee.Jwt的使用须要用到数据库,主要用于接管登录并生成Token用。插件默认支持三种数据库,分别是:mssql,mysqlpgsql.相关登录信息表必须包括如下三个字段:_name(用户名),_role(角色)和_password(密码).mysql脚本以下:正则表达式

CREATE TABLE `_users` (
  `_name` varchar(50) NOT NULL,
  `_password` varchar(45) DEFAULT NULL,
  `_role` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

JWT配置

插件使用须要进行配置,能够经过点击插件进入相关配置页面。sql

示例配置以下:数据库

{
    "Key": "ExxUqmeDKnAk1eMHV02ICJkwp82RsleM887yRnQS3Gg8OHCxWsLPlzCEAJActCo6y6Mae26JeGDFx7aYkeP7Efl6yh/d1q3XYRCdDLLGbz+kt3vR92H6s78P7JILNgZMiO6XoekKXfT2Qxle7Gyu/1d39NloKhqXgBdgzeobyyo=",
    "MD5": false,
    "DBType": "MYSQL",
    "ConnectionString": "Server=192.168.2.19;Database=world;Uid=root;Pwd=123456;",
    "VerifyPaths": [
        "^/api.*"
    ],
    "Table": "_users",
    "TokenTimeOut": 200,
    "RemoveHeaders": [
        "Cookie"
    ],
    "LoginMaxRps": 200
}
  • Key JWT处理密钥json

  • MD5 是否要把密码转MD5再查询api

  • DBType 数据类型,分别:MSSQL,MYSQL,PGSQL安全

  • ConnectionString 数据库链接字符串

  • VerifyPaths 须要验证的路径列表,正则表达式。

  • Table 用户表名称

  • TokenTimeOut 凭证超时时间,单位是分钟

  • RemoveHeaders转发时移走头列表

  • LoginMaxRps登录限制,每秒容许并发数,若是设置成零则不限.使用中建议设置一个并发限制,毕竟这个操做涉及到数据库IO处理,容易被恶意调用损耗网关性能。

JWT相关访问接口

  • http://host/__system/jwt/login?name=henry&pwd=123456&cookie=true

   登录获取Token访问Url,cookie参数表示返回Token并写入Cookie

  • http://host/__system/jwt/singout

   清除Cookie相应的Token信息.

请求Token配置

若是在调用登录的时候写入了Cookie那在请求过程当中再也不须要配置相关Token信息.在其余调用方式下须要把返回的Token配置到请求头的Authorization上。

应用示例

直接下来用aspcore编写一个webapi服务而后用Bumblebee进行一个代理并设置安全控制访问。

    public class ApiController : Controller
    {
        // GET: /<controller>/
        public IActionResult Index()
        {
            return new ContentResult { Content = $"{DateTime.Now}|name:{Request.Headers["jwt_user"]};role:{Request.Headers["jwt_role"]}" };
        }

        public IActionResult Hello(string name)
        {
            return new ContentResult { Content = $"hello {name} {DateTime.Now}|name:{Request.Headers["jwt_user"]};role:{Request.Headers["jwt_role"]}" };
        }
    }

服务启动的地址是http://localhost:58387/,在网关配置相关路由

JWT验证关闭后能够正常访问服务

因为没有通过网关的验证,因此jwt_userjwt_role信息为空。若是开启JWT验证又会怎样呢?

下面是开启的运行结果

因为请求没有凭证信息,因此被网关拦截并返回了相应的错误。接下来先访问一下登录接口并获取凭证http://localhost/__system/jwt/login?name=henry&pwd=123456&cookie=true,当凭证获取后就能够访问服务。

返回的结果能够正常获取jwt_userjwt_role信息,由于网关开启jwt后把相关登录凭让写入到相关信息头传入到相应的服务中。

相关文章
相关标签/搜索