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 观看大致上的说明便可,比较难理解的我都是一行一行给了备注的

.

相关文章
相关标签/搜索