JWT是一種用戶雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規範。JWT(Json Web Token)做爲一個開放的標準(RFC 7519),定義了一種簡潔的、自包含的方法用於通訊雙方之間以Json對象的形式進行安全性信息傳遞,傳遞時有數字簽名因此信息時安全的,JWT使用RSA公鑰密鑰的形式進行簽名。git
JWT格式的輸出是以.分隔的三段Base64編碼,與SAML等基於XML的標準相比,JWT在HTTP和HTML環境中更容易傳遞。(形式:xxxxx.yyy.zzz):github
一、Header:頭部
二、Payload:負載
三、Signature:簽名web
在header中一般包含了兩部分,Token類型以及採用加密的算法ajax
Token的第二部分是負載,它包含了Claim,Claim是一些實體(通常都是用戶)的狀態和額外的數據組成。算法
建立簽名須要使用編碼後的header和payload以及一個祕鑰,使用header中指定簽名算法進行簽名。spring
JWT客戶端發送請求到服務器端總體流程以下圖1所示:數據庫
在SpringBoot項目中使用JWT做爲接口安全框架,實現JWT生成以及驗證。編程
咱們使用InteiiJ IDEA工具來構建一個SpringBoot項目,預先導入依賴Web、JPA、MySQL等,項目結構以下圖2所示:json
目前JWT支持多中變成語言,咱們訪問官網jwt.io/,在首頁底部能夠看到JWT所支持的全部編程語言以及對應的依賴包,咱們選擇io.jsonwebtoken(GitHub地址:github.com/jwtk/jjwt),目前已經更新到0.7.0版本了,咱們添加最新的依賴到咱們的pom.xml配置文件中,以下圖3所示:api
咱們只須要導入紅框內的依賴便可,下面咱們開始添加對應的數據庫表結構。
咱們將生成的Token存放到數據庫中,要完成一整套的驗證咱們須要存儲用戶基本信息、Token基本信息兩張表。
能夠看到上圖4就是咱們的用戶信息表內的全部字段,其中咱們能夠添加自定義的字段如:ajax_bind_ip(ajax請求時綁定的客戶端的IP地址)。
咱們保存的Token在數據庫中是byte字節的形式存在,根據對應的appId生成一個Token。
咱們複製以前章節(第十三章:SpringBoot實戰SpringDataJPA,文章底部源碼連接)的application.yml配置文件到本章項目的resources目錄下,以下圖6所示:
修改pom.xml配置文件添加Druid的maven依賴,以下圖7所示:
咱們根據數據庫內的用戶基本信息表的字段構建出一個UserEntity,以下圖8所示:
根據token基本信息表內的字段構建出TokenEntity實體,以下圖9所示:
咱們實體建立完成後對應實體添加JPA,用於SpringDataJPA操做數據表信息。
咱們的準備工做已經作完,下面開始實現生成Token的控制器,咱們先來建立一個TokenController,以下圖12所示:
在編寫獲取Token的方法以前須要添加一個試圖返回的類,方便咱們在編寫獲取Token方法返回數據,以下圖13所示:
咱們在TokenController控制器內添加獲取Token的方法,以下圖1四、1五、1六、1七、18所示:
生成Token的方法比較長,因此仍是建議下載源碼查看,源碼連接在文章底部。
生成Token方法的內容大體是,檢查appId以及appSecret-->檢查是否存在該appId的對應Token-->根據存在與否、過時與否執行更新或者寫入操做-->返回用戶請求。
在createNewToken方法中是JWT生成Token的方法,咱們默認了過時時間爲7200秒,上面是毫秒單位,咱們生成token須要指定subject也就是咱們的用戶對象,設置過時時間、生成時間、還有簽名生成規則等。token生成方法已經編寫完成,下面咱們須要在除了獲取token的路徑排除在外攔截全部的路徑,驗證路徑是否存在header包含token,而且驗證token是否正確,jwt會自動給咱們驗證過時,若是過時會拋出對應的異常。
咱們在攔截器中須要驗證頭信息,Token的值是否存在,Subject用戶是否存在等。具體代碼以下圖1九、20所示:
Claims就是咱們生成Token是的對象,咱們把傳遞的頭信息token經過JWT能夠逆轉成Claims對象,而且經過getSubject能夠獲取到咱們用戶的appId。
咱們建立一個JWTConfiguration配置類,將咱們建立的攔截器添加到SpringBoot項目中,以下圖21所示:
注意:咱們配置JWT攔截器只攔截/api/下的全部路徑。
在啓動項目以前咱們先來配置一個IndexController,而且提供一個訪問內容的API接口,以下圖22所示:
下面咱們來啓動項目,訪問地址:127.0.0.1:8080/api/index,界面輸出內容以下圖23所示:
咱們在攔截器中配置的不管是不存在token仍是token須要刷新都是返回"need refresh token"錯誤信息,下面咱們在咱們的用戶信息表內添加一條測試數據,以下圖24所示:
其中密碼也是使用到了byte字節的形式保存,具體內容我會放到項目源碼resources目錄下!下面咱們經過/token地址獲取jwt生成的token值,以下圖25所示:
能夠看到咱們能夠正確的獲取到JWT生成的token值,咱們來看下是否存到數據庫中。以下圖26所示:
能夠看到咱們數據庫中已經有一條生成的Token值保存了,接下來咱們使用獲取到的Token經過Postman工具來訪問咱們的/api/index方法,以下圖27所示:
能夠看到咱們將以前獲取的token做爲請求header(X-YAuth-Token)的值進行傳遞,再次訪問127.0.0.1:8080/api/index,就能夠成功的獲取接口返回的數據。
注意:若是Token過時,再次訪問/jwt/token地址傳入對應的appId以及appSecret就能夠獲取一條新的token,也會對應的更新數據庫token信息表的內容。
以上內容就是本章的所有講解內容,本章主要講解了SpringBoot項目如何加入JWT維護接口安全性,而且將JWT生成的Token存放到數據庫中。
本章代碼已經上傳到碼雲:
SpringBoot配套源碼地址:gitee.com/hengboy/spr…
SpringCloud配套源碼地址:gitee.com/hengboy/spr…
SpringBoot相關係列文章請訪問:目錄:SpringBoot學習目錄
QueryDSL相關係列文章請訪問:QueryDSL通用查詢框架學習目錄
SpringDataJPA相關係列文章請訪問:目錄:SpringDataJPA學習目錄
SpringBoot相關文章請訪問:目錄:SpringBoot學習目錄,感謝閱讀!
歡迎加入QQ技術交流羣,共同進步。