Spring Security + JWT學習

開胃:Oauth2認證流程分析

如今第三方登陸已經很廣泛了,隨便哪一個App都會有使用微信登陸,使用手機號碼登陸,或者使用支付寶登陸等功能...java

下面咱們就以使用微信登陸,作一個簡單的流程分析分析mysql

開胃:JWT認識

在上面的Oauth2的認證流程中,咱們就能夠看出一些貓膩來:git

  • 在咱們拿着令牌去用戶信息系統調用用戶的相關信息的時候,web

  • 用戶信息系統其實去請求了受權服務器,驗證l了該令牌的合法性算法

這樣每次認證都須要去調用受權服務器作一個令牌合法性驗證,顯得效率低下。spring

JWT令牌思想

JWT令牌場景運用

以前返回的令牌就是一個普通的令牌,使用了JWT以後,這個令牌似乎變得有點意思了起來sql

  • 用戶在受權服務器經過以後,會獲得一個JWT令牌;apache

  • 這個令牌中就已經包含了用戶相關的信息;json

  • 客戶端只須要攜帶該JWT令牌訪問資源服務器便可;api

  • 資源服務器會按照約定的算法自動完成令牌的校驗,這就就不用再去請求受權服務器了

流程我相信你們都已經看懂了,下面咱們就來一點文的,解釋一下JWT

JWT簡單介紹

Json Web Token:JWT一共包含了三部分數據,這三部分數據經過.分割拼接而成的字符串,如:xxx.yyy.zzz

1.Header:頭部【JSON】,一般頭部有兩部份信息,咱們可對頭部信息進行base64加密解密獲得頭部信息

  • 聲明類型,這是一個JWT

  • 聲明加密算法:自定義(HMAC / RSA /...)

  • 以下所示模樣,

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

2.payload【JSON】:載荷,就是咱們要寄存的數據,通常包含一下信息

  • 用戶身份信息(採用bases加密,可解密,不建議存放過於敏感的信息)

  • 註冊聲明:如該token的簽發時間,過時時間(exp),簽發人(iss)等信息

  • 以下所示模樣:

  • {
    "name": "456",
    "admin": true
    }

3.Signature:簽名,是整個數據的認證信息,

通常根據前兩部的數據再加上服務器上的密鑰經過加密算法生成,用於驗證整個數據的完整性和可靠性

  • 以下所示模樣:

  • HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret)
  • base64UrlEncode(header) :令牌的頭部分

  • base64UrlEncode(payload):令牌的載荷

  • secret :簽名所使用的密鑰

看到這裏,腦子裏一現,是否是能夠實現單點登陸哦?就用載荷保存用戶的惟一id,其餘服務豈不是就能夠得到用戶信息?

Spring Security + JWT的Demo

項目介紹

  • 這裏或許你就會有疑問了?爲何上面咱們說了Oauth2,這裏卻不小試牛刀呢?

  • 由於 Oauth2通常運用與分佈式項目中,須要單獨起一個服務作鑑權服務,而我並無想去搭建一套SpringCloud的想法

  • 因此這裏就藉着網上的一點小資料,代碼也是模仿的別人的,我對它進行吸取並作下學習筆記順便分享出來

pom文件指定相關依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ninja.study</groupId>
    <artifactId>security_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Ninja-Security</name>
    <description>鞋破露腳尖兒</description><properties>
        <java.version>1.8</java.version>
    </properties><dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.10.7</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.10.7</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.10.7</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency><dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build></project>

application.yml配置

更正一下,mysql的驅動類後面更換爲了:com.mysql.cj.jdbc.Driver 望周知!

Code:GitHub見

很差理解的地方作了特別詳細的說明,你們學習可自行下載便可:

GitHub

項目說明望周知

自測結果先說明一下:

註冊用戶

用戶登陸:

用戶帶着token去訪問服務

而後就是項目源碼說明:TODO 觀看大致上的說明便可,比較難理解的我都是一行一行給了備註的

.

相關文章
相關標籤/搜索