详解用JWT对SpringCloud进行认证和鉴权

时间:2021-05-19

JWT(JSON WEB TOKEN)是基于RFC 7519标准定义的一种可以安全传输的小巧和自包含的JSON对象。由于数据是使用数字签名的,所以是可信任的和安全的。JWT可以使用HMAC算法对secret进行加密或者使用RSA的公钥私钥对来进行签名。

JWT通常由头部(Header),负载(Payload),签名(Signature)三个部分组成,中间以.号分隔,其格式为Header.Payload.Signature

Header:声明令牌的类型和使用的算法

  • alg:签名的算法
  • typ:token的类型,比如JWT

Payload:也称为JWT Claims,包含用户的一些信息

系统保留的声明(Reserved claims):

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众用户
  • nbf (Not Before):在此之前不可用
  • iat (Issued At):签发时间
  • jti (JWT ID):JWT唯一标识,能用于防止JWT重复使用

公共的声明(public):见 http://ponent public class JWTAuthFilter implements GlobalFilter, Ordered{ @Override public int getOrder() { return -100; } @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String url = exchange.getRequest().getURI().getPath(); //忽略以下url请求 if(url.indexOf("/auth-service/") >= 0){ return chain.filter(exchange); } //从请求头中取得token String token = exchange.getRequest().getHeaders().getFirst("Authorization"); if(StringUtil.isEmpty(token)){ ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.OK); response.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); Response res = new Response(401, "401 unauthorized"); byte[] responseByte = JSONObject.fromObject(res).toString().getBytes(StandardCharsets.UTF_8); DataBuffer buffer = response.bufferFactory().wrap(responseByte); return response.writeWith(Flux.just(buffer)); } //请求中的token是否在redis中存在 boolean verifyResult = JWTUtil.verify(token); if(!verifyResult){ ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.OK); response.getHeaders().add("Content-Type", "application/json;charset=UTF-8"); Response res = new Response(1004, "invalid token"); byte[] responseByte = JSONObject.fromObject(res).toString().getBytes(StandardCharsets.UTF_8); DataBuffer buffer = response.bufferFactory().wrap(responseByte); return response.writeWith(Flux.just(buffer)); } return chain.filter(exchange); } }

3、关键的application配置信息

spring: application: name: service-gateway cloud: gateway: discovery: locator: enabled: true lowerCaseServiceId: true routes: #认证服务路由 - id: auth-service predicates: - Path=/auth-service/** uri: lb://auth-service filters: - StripPrefix=1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章