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控制

猜你喜欢

转载自my.oschina.net/u/3658506/blog/2985967
今日推荐