Beetlex服務框架之Webapi訪問限制和url重寫

  • 2019 年 10 月 24 日
  • 筆記

在新版本的BeetleX.FastHttpApi中集成了IP訪問策略和URL重寫兩個功能,通過IP訪問策略可以制定服務針對不同IP的訪問限制控制;而URL重寫則可以制定更好的URL訪問方式。以下介紹這兩的功能的使用:

IP策略

組件在1.6.7開始集成了IP限制功能,可以通過配置白名單或黑名單的方式來配置可訪問的IP。該功能默認情況是禁用,如果有需要則打開此功能來對訪問進行限制(該功能暫只對IPv4有效,IPv6則暫時無效)。

配置

可以通過HttpApiServer.IPv4Tables.Type配置IP訪問限制,默認值是None不開啟,配置Black開啟默名單限制,所有在黑名單中的IP不能訪問服務;配置White開啟白名單,所有在白名單中的IP才能訪問服務。可以通過以下方法來添加IP

  • AddWhite方法添加白名單IP

HttpApiServer.IPv4Tables.AddWhite("192.168.2.1/24","192.168.1.18");

  • AddBlack方法添加黑名單IP

HttpApiServer.IPv4Tables.AddBlack("192.168.2.1/24","192.168.1.18");

配置文件

可以通過文件來配置,在目錄下編輯iptables.json(如果文件不存在自行添加)

{    "Type": "White",    "WhiteList": [ "192.168.2.1/24", "192.168.2.18" ],    "BlackList": [ "192.168.2.1/24" ]  }   


Url重寫

通過Url重寫可以提高Url訪問友好性同時不需要調整原有服務的Url訪問地址,組件在新版本對Url重寫進行的優化調整,以支持更靈活的重寫功能

配置

可以通過HttpApiServer.UrlRewrite.Add方法來添加Url重寫規則.

  server.UrlRewrite.Add("/cate/{0}.html", "/index.html");

以上重寫是把/cate/下面的所有html重寫到index.html.

配置文件

如果不想通過寫代碼來完成,可以配置目錄下的rewrite.json文件(不存在則自行添加)

[    {      "Url": "/cate/{0}.html",      "Rewrite": "/index.html"    }  ]

詳細描述

組件對Url重寫的依據是BaseUrl基礎訪問路徑進行匹配,匹配方式不匹分大小寫。通過{name}來描述一個Url的可變部分,name是一個變量名,這個變量可以在重寫Url部分使用,一個Url可以有多個變量描述.這些重寫的變量都會被寫入到HttpContext的請求數據中,更方便綁定到控制器參數上.

  • 示例一

        {              "Url": "/api/customers/{count}",              "Rewrite": "/customers/{count}"          }

  • 示例二

        {              "Url": "/api/{user}/{id}",              "Rewrite": "/api/{user}?id={id}"          }

  • 官方blog

            server.UrlRewrite.Add("/cate/{0}.html", "/index.html", "html")                  .Add("/search/{0}.html", "/index.html", "html")                   .Add("/tag/{0}.html", "/index.html", "html")                    .Add("/blog/{0}.html", "/blog.html", "html")                    .Add("/photos/{0}.html", "/photos.html", "html");

以上是 http://ikende.com/blog/ 的一個重寫規則,把分類,標籤和查詢都路由到index.html頁面處理了。

動態重寫

靜態規則有時候很難滿足應用的需要,因此組件HttpRequest提供UrlRewriteTo方法用於重寫當前的請求Url。那什麼時候使用動態重寫呢?以下描述一個簡單的場景來表述動態重寫的作用,當一個API提供了一個V1版後又開發了V2版本,但希望用戶在不改變Url基礎規則的情況可以兼容兩種版本的調用;出現這情況一般會想到在前置代理做一些轉發規則來滿足需求,但組件提供動態重寫則可以滿足這樣的需求。

    [Controller(BaseUrl = "Api")]      public class Api      {          public object Hello(string name)          {              return $"hello {name} {DateTime.Now}";          }      }        [Controller(BaseUrl = "/v2/Api")]      public class ApiV2 : IController      {          public object Hello(string name)          {              return $"hello {name} {DateTime.Now} v2";          }          [NotAction]          public void Init(HttpApiServer server, string path)          {              server.HttpRequesting += (o, e) =>              {                  if (e.Request.BaseUrl.IndexOf("/api", StringComparison.OrdinalIgnoreCase) >= 0)                  {                      if (e.Request.Data["version"] == "v2")                      {                          e.Request.UrlRewriteTo("/v2" + e.Request.Url);                      }                  }              };          }      }

只需要在實現V2版本中對HttpRequesting進行一個監聽並根據情況進行處理即可以;而V1的代碼無須更改,已有的Url沒有變化,只需要在新的調用中添加對應的版本描述即實現。

Url重寫是BeetleX的webapi基礎功能,因此對應的服務網關也可以定義相關url重寫功能用於服務轉發上.服務網關重寫插件使用:https://github.com/IKende/Bumblebee/wiki/Url重寫