微服务鉴权实现

微服务鉴权实现

实现流程:

微服务鉴权实现_第1张图片

  1. 用户进入网关进行登录,网关过滤器进行判断,如果是登录请求,则通过路由到后台管理微服务进行登录

  2. 登录成功后,后台管理微服务签发JWT TOKEN信息返回给用户

  3. 用户再次进入网关开发访问,网关过滤器接收用户携带的TOKEN

  4. 网关过滤器解析TOKEN,判断是否有权限,如果有,则放行,没有则返回来

签发JWT TOKEN信息返回给用户

    @PostMapping("/login")
    public Result login(@RequestBody Admin admin){
        boolean login = adminService.login(admin);
        if (login){
            //密码正确
            //获得用户名放入集合
            Map<String,String> map = new HashMap();
            map.put("username",admin.getLoginName());
            //生成一个jwt令牌,返回到客户端
            String jwt = JwtUtil.createJWT(UUID.randomUUID().toString(), admin.getLoginName(), null);
            map.put("token",jwt);
            return new Result(true,StatusCode.OK,"登陆成功",map);
        }else {
            return new Result(false,StatusCode.ERROR,"登陆失败");
        }
    }

过滤器

/**
 * 过滤器
 */
@Component
public class AuthorizeFilter implements GlobalFilter,Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求的对象
        ServerHttpRequest request = exchange.getRequest();
        //2.响应对象
        ServerHttpResponse response = exchange.getResponse();
        //3.当前请求是否是登录请求,如果是就放行
        if (request.getURI().getPath().contains("/admin/login")){
            //放行
            return chain.filter(exchange);
        }
        //4.获取当前所有请求头信息
        HttpHeaders headers = request.getHeaders();
        //5.获取gwt的令牌信息
        String token = headers.getFirst("token");
        //6.判断当前令牌是否存在
        if (StringUtils.isEmpty(token)){
            //6.1如果不存在返回错误信息给客户端
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }

        //6.2如果存在解析gwt令牌,判断该令牌是否合法。如果令牌不合法向客户端返回错误信息
        try {
            JwtUtil.parseJWT(token);
        }catch (Exception e){
            e.printStackTrace();
            //解析失败
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }

        //6.3如果令牌合法,则放行
        return chain.filter(exchange);
    }

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

你可能感兴趣的:(过滤器,网关,jwt,java)