JWT結合Springboot+shiro,session、token同時存在來應對不同的業務場景(物聯網設備管理及開放api)

一、背景說明

    需求是這樣滴:對物聯網終端設備以及網關設備進行統一的管理,這裏需要一個設備管理平臺,同時呢,計劃開放API,以供應用開發者調用API來管理控制設備。設備管理平臺本身的用的是傳統的session來管理,設備管理者數量並不多,所以不會有超量的session給服務器造成太大的壓力。開放API給第三方應用用戶是爲了應對第三方用戶開發的各種移動端app以及需要自身維護的設備管理。所以用session就不是那麼合適,計劃採取token的方式。

    多年以前我用過token這種方式來開發,那時候似乎還沒有jwt這個框架,我記得是根據用戶名密碼生成token後存在數據庫中的,每次token進來是需要從數據庫中或者提前緩存的token池中來找到匹配的token以確保不是非法請求。

    閒話多了,看看正題。

二、JWT以及JJWT介紹

首先呢,我們可以通過這裏來看看JWT是個什麼樣的東西:https://jwt.io/introduction/  官方說的很清楚了,我就用我蹩腳的英文來給大家解釋下:

1、什麼是JSON Web Token?

    JSON Web Token (JWT)是一個開放的標準(RFC 7519),它定義了一種簡潔獨立的方式,以JSON對象的形式在各方之間安全地傳輸信息。

2、什麼時候使用JWT呢?

    授權和信息交換的時候

3、JWT結構介紹

    JWT說白了,就是一串字符串,包含三個部分,三部分之間用“.”來分割。三部分分別是:

  • Header
  • Payload
  • Signature

    最後形成的字符串就像這樣:xxxxx.yyyyy.zzzzz

    Header大概就是這樣的:

{
  "alg": "HS256",
  "typ": "JWT"
}

    payload就是放內容的,官方叫做claims,這個是啥玩意呢?這玩意是聲明一些實體,包括jwt自己已經定義好的特色的聲明,還有一些用戶加上的聲明(我們這些開發者想加上的)以及一些附加數據

    這玩意有三種類型,分別是 registeredpublic, and private claims. Registered Claims就是官方已經定義了的,比如:iss (issuer), exp (expiration time), sub (subject), aud(audience)  public呢,就是自己可以隨意定義了,要注意避免命名空間的衝突,https://www.iana.org/assignments/jwt/jwt.xhtml。private就是幾方之間約定的,沒有註冊public的claims。感覺說多了自己都暈。

    說白了就是一些key value,大概是這個樣子的:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

     signature是簽名嘍,就是你要發這些,你籤個字再發,大概就是這個樣子滴。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

    最終形成這麼個玩意:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

三、和springboot整合

待續啊,睡覺了先。

四、排除shiro控制

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章