首页 > 技术文章 > 使用网关zuul过滤器登录鉴权

programer-xinmu78 2019-03-17 19:20 原文

使用网关zuul过滤器登录鉴权

    1、新建一个filter包

        filte有很多种 pre、post。

    2、新建一个类LoginFilter,实现ZuulFilter,重写里面的四个方法(可以根据业务建很多个过滤器filter)

        filterType/filterOrder/shouldFilter/run

        1)、filterType返回过滤器类型,前置类型为return PRE_TYPe,引入类FilterConstants,在类中可以看到各类filter定义

        有以下几种

         public static final String ERROR_TYPE = "error";

            public static final String POST_TYPE = "post";

            public static final String PRE_TYPE = "pre";

            public static final String ROUTE_TYPE = "route";

            public static final String FORWARD_LOCATION_PREFIX = "forward:";

        2)、在filterOrder中return 4,要解码后,PRE_DECORATION_FILTER_ORDER之前。order越小越优先执行

        3)、shouldFilter为过滤器是否生效,确认URI为save方法则需要运行拦截(登录鉴权),如果不是则不拦截

             RequestContext requestContext= RequestContext.getCurrentContext();

                HttpServletRequest httpServletRequest=requestContext.getRequest();

                System.out.println(httpServletRequest.getRequestURI());///apigateway/order/api/v1/orderfeignhystrix/save

                System.out.println(httpServletRequest.getRequestURL());//http://192.168.136.128:9000/apigateway/order/api/v1/orderfeignhystrix/save

 

                if ("/apigateway/order/api/v1/orderfeignhystrix/save".equalsIgnoreCase(httpServletRequest.getRequestURI())) //小的项目可以按照一个一个编写,如果大的项目会使用ACL控制

                {

                    return true;

                }

                return false;

        4)、run为过滤的方法,通过token来确认是否登录,如果没有token则提示拦截了,并反馈未认证401

             System.out.println("l拦截了!");

//JWT

RequestContext requestContext=RequestContext.getCurrentContext();

HttpServletRequest request=requestContext.getRequest();

//token对象

String token=request.getHeader("token");

if (StringUtils.isBlank(token))

{

token=request.getParameter("token");

}

if (StringUtils.isBlank(token))

{

requestContext.setSendZuulResponse(false);

requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);

}

return null;

            

            看下JWT和token技术

            

    3、在类顶部加注解,@Component,让Spring扫描

    4、测试

    http://192.168.136.128:9000/apigateway/order/api/v1/orderfeignhystrix/save?userId=2&productId=2&token=333,可以访问

    http://192.168.136.128:9000/apigateway/order/api/v1/orderfeignhystrix/save?userId=2&productId=2访问不了

推荐阅读