springcloud微服务鉴权

  1. 微服务鉴权
    1.1 实现思路
    在这里插入图片描述

1.2 登录成功签发令牌
/**

  • 后台登录,登录成功后,生成JWT令牌到前端
  • @param admin
  • @return 返回登录的结果
    */
    @PostMapping("/login")
    public Result login(@RequestBody Admin admin){
    // 获取结果
    if (adminService.login(admin)){
    // 前台需要接受username + token ,使用map进行回传数据
    Map<String,String>info = new HashMap();
    // 获取登录的用户名传到前台
    info.put(“username”,admin.getLoginName());
    // 登录成功 。构建jwt令牌
    String jwtToken = JwtUtil.createJWT(“2014”, “login”, null);
    info.put(“token”,jwtToken);
    return new Result(true, StatusCode.OK,“登录成功”,info);
    }else {
    return new Result(true, StatusCode.ERROR,“登录失败”);
    }
    }

1.3 微服务网关中认证过滤器
1).pom.xml

io.jsonwebtoken
jjwt
0.9.0

2). 引入工具类 JwtUtil
3). 认证过滤器
逻辑 :
A. 判定当前的请求路径, 是否是登录操作, 如果是登录操作 , 直接放行 ;
B. 从请求头header中获取令牌token , 如果没有令牌, 直接返回未认证(不再继续往下路由) ;
C. 如果有令牌, 解析令牌 , 令牌解析成功, 放行(继续往下路由) ;
D. 令牌解析失败 , 直接返回未认证(不再继续往下路由) ;
代码实现 :
@Component
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.先获取request,response
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();

// 2.通过request获取请求路径uri,如果是进行登录,则直接放行
if (request.getURI().getPath().contains("/admin/login")){
    return chain.filter(exchange);
}

// 3.如果不是进行登录。则从看请求头中是否包含token jwt令牌
String token = request.getHeaders().getFirst("token");
if (StringUtils.isEmpty(token)){
    // 如果请求头中不包含token 则返回错误的提示 返回授权未通过的提示
    response.setStatusCode(HttpStatus.UNAUTHORIZED);
    return response.setComplete();
}

// 4.如果token存在。则进行校验是否正确。
// token校验过程中如果发生异常,则证明校验未通过 所以可以使用try catch 进行包裹校验
try{
    JwtUtil.parseJWT(token);
}catch (Exception e){
    // 如果发生异常,也给客户端发送没有权限未通过的信息
    e.printStackTrace();
    response.setStatusCode(HttpStatus.UNAUTHORIZED);
    return response.setComplete();
}
// 5.如果没有报错,则证明令牌正确,通过放行
return chain.filter(exchange);

}
@Override
public int getOrder() {
return 0;
}
}


在这里插入图片描述

流程 :

在这里插入图片描述

发布了92 篇原创文章 · 获赞 3 · 访问量 2802

猜你喜欢

转载自blog.csdn.net/weixin_44993313/article/details/104401217
今日推荐