真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Openresty如何實現(xiàn)的網(wǎng)關權限控制

小編給大家分享一下Openresty如何實現(xiàn)的網(wǎng)關權限控制,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

榆中網(wǎng)站建設公司創(chuàng)新互聯(lián)建站,榆中網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為榆中上1000+提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務好的榆中做網(wǎng)站的公司定做!

技術棧

本小節(jié)采用了以下的技術棧:

  • Openresty(lua+nginx)

  • MySQL

  • redis

  • cjson

驗證流程

  • 用戶請求經(jīng)過nginx,nginx的openresty的模塊通過攔截請求來進行權限判斷

  • openresty的access_by_lua_file模塊,進行了一系列的判斷

    • 用戶的請求是否為白名單uri,如果為白名單uri,則直接通過驗證,進入下一個驗證環(huán)節(jié)content_by_lua_file,這個環(huán)節(jié)直接打印一句話:“恭喜,請求通過?!?/p>

    • 如果用戶請求不為白名單url,則需要取出請求header中的token,如果請求的header不存在token,則直接返回結果401,無權限訪問。

    • 如果用戶請求的uri的請求頭包含token ,則取出token,解密token取出用戶id

    • 根據(jù)取出的userid去查詢數(shù)據(jù)庫獲取該用戶的權限,如果權限包含了該請求的uri,請求可以通過,否則,請求不通過。

  • 請求如果通過access_by_lua_file模塊,則進入到content_by_lua_file模塊,該模塊直接返回一個字符串給用戶請求,在實際的開發(fā)中,可能為路由到具體的應用程序的服務器。

驗證流程圖如下所示:

Openresty如何實現(xiàn)的網(wǎng)關權限控制

vim /usr/example/example.conf ,加上以下的配置:

 location / {
    default_type "text/html";
    access_by_lua_file /usr/example/lua/api_access.lua;
    content_by_lua_file /usr/example/lua/api_content.lua;
  }

以上的配置表示,要不符合已有l(wèi)ocation路徑的所有請求,將走這個location為/  的路徑。符合這個location的請求將進入 access_by_lua_file和 content_by_lua_file的模塊判斷。

vim /usr/example/lua/access_by_lua_file ,加上以下代碼:

local tokentool = require "tokentool"
local mysqltool = require "mysqltool"

 function is_include(value, tab)
   for k,v in ipairs(tab) do
      if v == value then
           return true
       end
    end
    return false
 end

local white_uri={"/user/login","/user/validate"}

--local user_id = ngx.req.get_uri_args()["userId"]
--獲取header的token值
local headers = ngx.req.get_headers() 
local token=headers["token"]
local url=ngx.var.uri
if ( not token) or (token==null) or (token ==ngx.null) then
  if is_include(url,white_uri)then

  else
    return ngx.exit(401)
  end  
else 
  ngx.log(ngx.ERR,"token:"..token)
  local user_id=tokentool.get_user_id(token)
  if (not user_id) or( user_id ==null) or ( user_id == ngx.null) then
      return ngx.exit(401)   
  end 

  ngx.log(ngx.ERR,"user_id"..user_id)
  local permissions={}
  permissions =tokentool.get_permissions(user_id)
  if(not permissions)or(permissions==null)or( permissions ==ngx.null) then
      permissions= mysqltool.select_user_permission(user_id)
      if permissions and permissions ~= ngx.null then
         tokentool.set_permissions(user_id,permissions)
      end
  end  
  if(not permissions)or(permissions==null)or( permissions ==ngx.null) then
     return ngx.exit(401)
  end 
  local is_contain_permission = is_include(url,permissions) 

  if is_contain_permission == true  then
     -- ngx.say("congratuation! you have pass the api gateway")
  else
      return ngx.exit(401) 
  end   
end

在上述代碼中:

  • is_include(value, tab),該方法判斷某個字符串在不在這個table中。

  • white_uri={“/user/login”,”/user/validate”} 是一個白名單的列表。

  • local headers = ngx.req.get_headers()從請求的uri的請求頭獲取token

  • is_include(url,white_uri)判斷該url是否為白名單url

  • local user_id=tokentool.get_user_id(token)根據(jù)token獲取該token對應的用戶的user_id,在常見情況下,是根據(jù)token解析出user_id,但在不同的語言加密和加密token存在鹽值不一樣的情況,比較麻煩,所以我偷了個懶,直接存了redis,用戶登錄成功后存一下。

  • permissions =tokentool.get_permissions(user_id)根據(jù)user_id
    從redis獲取該用戶的權限。

  • permissions= mysqltool.select_user_permission(user_id)如果redis沒有存該用戶的權限,則從數(shù)據(jù)庫讀。

  • tokentool.set_permissions(user_id,permissions),將從數(shù)據(jù)庫中讀取的權限點存在reddis中。

  • local is_contain_permission = is_include(url,permissions),判斷該url 在不在該用戶對應的權限列表中。

如果所有的判斷通過,則該用戶請求的具有權限訪問,則進入content_by_lua_file模塊,直接在這個模塊給請求返回“congratulations! you have passed the api gateway”。

vim  /usr/example/lua/api_content.lua ,添加以下內(nèi)容:

ngx.say("congratulations!"," you have passed ","the api gateway")  
----200狀態(tài)碼退出  
return ngx.exit(200)

驗證演示

打開瀏覽器訪問http://116.196.177.123/user/login,瀏覽器顯示:

congratulations! you have passed the api gateway

/user/login這個url 在白名單的范圍內(nèi),所以它是可以通過權限驗證的。

打開瀏覽器訪問http://116.196.177.123/user/sss,顯示以下內(nèi)容:

401 Authorization Required

openresty/1.11.2.4

在redis中添加一對key-value,key為token_forezp,value為1,即token_forezp對應的用戶的id為1.

/usr/servers/redis-3.2.6

src/redis-cli

set token_forezp 1

初始化以下的sql腳本,即給用戶id為1的用戶關聯(lián)角色,角色并關聯(lián)權限:

INSERT INTO `permission` VALUES ('1', '/user/orgs');
INSERT INTO `role` VALUES ('1', 'user');
INSERT INTO `role_permission` VALUES ('1', '1', '1');
INSERT INTO `user` VALUES ('1', 'forezp');
INSERT INTO `user_role` VALUES ('1', '1', '1');

用postman請求,在請求頭中加入token,值為token_forezp,請求結果如下:

Openresty如何實現(xiàn)的網(wǎng)關權限控制

以上是“Openresty如何實現(xiàn)的網(wǎng)關權限控制”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


網(wǎng)站題目:Openresty如何實現(xiàn)的網(wǎng)關權限控制
標題鏈接:http://weahome.cn/article/ihcscp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部