当前位置:   article > 正文

[技术陈旧] SpringCloud-Zuul网关 自定义ZuulFilter过滤器实现登录鉴权_zuul 鉴权

zuul 鉴权

过滤器类型和请求的生命周期

Zuul 中的过滤器跟我们之前使用的 javax.servlet.Filter 不一样,javax.servlet.Filter 只有一种类型,可以通过配置 urlPatterns 来拦截对应的请求。

而 Zuul 中的过滤器总共有 4 种类型,且每种类型都有对应的使用场景。

1)pre
可以在请求被路由之前调用。适用于身份认证的场景,认证通过后再继续执行下面的流程。

2)route
在路由请求时被调用。适用于灰度发布场景,在将要路由的时候可以做一些自定义的逻辑。

3)post
在 route 和 error 过滤器之后被调用。这种过滤器将请求路由到达具体的服务之后执行。适用于需要添加响应头,记录响应日志等应用场景。

4)error
处理请求时发生错误时被调用。在执行过程中发送错误时会进入 error 过滤器,可以用来统一记录错误信息。

 


        通过上面的图可以清楚地知道整个执行的顺序,请求发过来首先到 pre 过滤器,再到 routing 过滤器,最后到 post 过滤器,任何一个过滤器有异常都会进入 error 过滤器。

        通过 com.netflix.zuul.http.ZuulServlet 也可以看出完整执行顺序,ZuulServlet 类似 Spring-Mvc 的 DispatcherServlet,所有的 Request 都要经过 ZuulServlet 的处理。



自定义过滤器需要继承 ZuulFilter,并且需要实现下面几个方法:

1)shouldFilter
是否执行该过滤器,true 为执行,false 为不执行,这个也可以利用配置中心来实现,达到动态的开启和关闭过滤器。

2)filterType
过滤器类型,可选值有 pre、route、post、error。

3)filterOrder
过滤器的执行顺序,数值越小,优先级越高。

4)run
执行自己的业务逻辑,本段代码中是通过判断请求中是否有token,决定是否进行拦截。当token为空时,通过设置 requestContext.setSendZuulResponse(false),告诉 Zuul 不需要将当前请求转发到后端的服务了。通过 setResponseBody 返回数据给客户端。

 



通过上面的铺垫了解,下面正试开始用Zuul网关ZuulFilter过滤器实现登录鉴权
Zuul 网关服务项目的环境搭建,
可参考博文 
[技术陈旧] SpringCloud-Zuul网关项目 环境搭建和整合Eureka访问_springcloud创建一个zuul网关服务,实现通过网关访问eureka client中的接口-CSDN博客
项目核心代码,Zuul过滤器代码

  1. import com.netflix.zuul.ZuulFilter;
  2. import com.netflix.zuul.context.RequestContext;
  3. import com.netflix.zuul.exception.ZuulException;
  4. import org.apache.commons.lang.StringUtils;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.stereotype.Component;
  7. import javax.servlet.http.HttpServletRequest;
  8. import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
  9. /**
  10. * 登录过滤器
  11. */
  12. //这个注解不要忘了,加入spring容器中
  13. @Component
  14. public class LoginFilter extends ZuulFilter {
  15. /**
  16. * 过滤器类型
  17. * org.springframework.cloud.netflix.zuul.filters.support.FilterConstants 这个类
  18. * pre:在请求被路由(转发)之前调用
  19. * route:在路由(请求)转发时被调用
  20. * error:服务网关发生异常时被调用
  21. * post:在路由(转发)请求后调用
  22. * @return
  23. */
  24. @Override
  25. public String filterType() {
  26. //前置过滤器
  27. return PRE_TYPE;
  28. }
  29. /**
  30. * 过滤器顺序,越小越先执行
  31. * @return
  32. */
  33. @Override
  34. public int filterOrder() {
  35. return 4;
  36. }
  37. /**
  38. * 过滤器是否生效
  39. * @return
  40. */
  41. @Override
  42. public boolean shouldFilter() {
  43. RequestContext requestContext = RequestContext.getCurrentContext();
  44. HttpServletRequest request = requestContext.getRequest();
  45. System.out.println(request.getRequestURI()); ///apigateway/product/api/v1/product/list
  46. System.out.println(request.getRequestURL()); //http://localhost:9000/apigateway/product/api/v1/product/list
  47. //ACL
  48. //进行拦截,就会进入下面的 run方法中
  49. if (request.getRequestURI().contains("/apigateway/orderapi/ordermapping/savedingdan")){
  50. return true;
  51. }
  52. //不拦截,放行
  53. return false;
  54. }
  55. /**
  56. * 业务逻辑
  57. * @return
  58. * @throws ZuulException
  59. */
  60. @Override
  61. public Object run() throws ZuulException {
  62. //获取上下文
  63. RequestContext requestContext = RequestContext.getCurrentContext();
  64. //获取request对象
  65. HttpServletRequest request = requestContext.getRequest();
  66. //token对象
  67. String token = request.getHeader("token");
  68. if(StringUtils.isBlank((token))){
  69. token = request.getParameter("token");
  70. }
  71. //登录校验逻辑 根据公司情况自定义 JWT
  72. //token为空,就不能访问
  73. if (StringUtils.isBlank(token)) {
  74. //停止访问,并返回出错的消息
  75. requestContext.setSendZuulResponse(false);
  76. //防止中文乱码
  77. requestContext.getResponse().setContentType("text/html;charset=UTF-8");
  78. //设置返回的状态码和正文
  79. requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
  80. requestContext.setResponseBody("userToken is null");
  81. }
  82. //正常的话,继续向下走
  83. return null;
  84. }
  85. }

效果验证
1 当访问包含"/apigateway/orderapi/ordermapping/savedingdan"的请求时,就会拦截,如果有token,就可以正常访问,没有token,就会终止访问
2 其它请求不拦截,可正常访问

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/792653
推荐阅读
相关标签
  

闽ICP备14008679号