【微服务】轻松搞定SpringCloud微服务目录
本系列为连载文章,阅读本文之前强烈建议您先阅读前面几篇。
上一节我们讲到API网关zuul ,对于Spring Cloud 来说,zuul除了可以做api接口的统一暴露,还应该具备权限控制的相关功能。
在没有引入Spring Cloud成套体系中,对于单体springboot 所开发的应用使用springmvc自带拦截器就可以实现对路径的拦截,截取request中特定的参数进行校验,如果合法就可以访问,如果不合法便返回403。
对于组件zuul中,其实带有权限认证的功能,那就是ZuulFilter过滤器。
ZuulFilter是Zuul中核心组件,通过继承该抽象类,覆写几个关键方法达到自定义调度请求的作用。
起飞之前,还是那句话,推荐先看前面博文。本次还是基于api网关功能的延伸,因此为了避免和前一片文章中子项目冲突,我们新建一个子项目,然后复制api-gateway-zuul项目的代码。
在新建的子项目下面,我们创建一个包config ,然后在下面创建AccessTokenFilter文件,清单如下:
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import javax.servlet.http.HttpServletRequest; /** * Created by Administrator on 2017/12/21. */ public class AccessTokenFilterextends ZuulFilter{ @Override public String filterType(){ return "pre";//前置过滤器 } @Override public int filterOrder(){ return 0;//优先级为0,数字越大,优先级越低 } @Override public boolean shouldFilter(){ return true;//是否执行该过滤器,此处为true,说明需要过滤 } @Override public Object run(){ RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String username = request.getParameter("token"); if (null != username && username.equals("www.hanyahong.com")) {//暂时简单化测试 ctx.setSendZuulResponse(true);// 对该请求进行路由 ctx.setResponseStatusCode(200); ctx.set("isSuccess", true);// 设值,可以在多个过滤器时使用 return null; } else { ctx.setSendZuulResponse(false);// 过滤该请求,不对其进行路由 ctx.setResponseStatusCode(403);// 返回错误码 ctx.setResponseBody("{/"result/":/"Request illegal!the token is null/"}");// 返回错误内容 ctx.set("isSuccess", false); return null; } } }
filterOrder:filter执行顺序,通过数字指定
shouldFilter:filter是否需要执行 true执行 false 不执行
run :filter具体逻辑
filterType :filter类型,分为pre、error、post、 route
> pre:请求执行之前filter route: 处理请求,进行路由 post: 请求处理完成后执行的filter error:出现错误时执行的filter
官网给出一个四种类型的示意图:
自行创建Filter需要手动加载到容器进行统一管理。在主方法 Application.java 中,可以加入以下代码:
/** * 加载过滤器 * @return */ @Bean public AccessTokenFilter accessFilter(){ return new AccessTokenFilter(); }
分别启动子项目 cloud-hyh-discovery-eureka 、 cloud-hyh-service-1 以及刚刚创建的api网关的新子项目。
首先可以访问 http://localhost:8081/ 查看服务是否已经都启动完毕。
其次通过网关访问service-1服务中的 /ribbon/name 接口,查看是否允许访问。 http://localhost:8080/cloud-service/ribbon/name。通过访问可以看到浏览器提示:
{"result":"Request illegal!the token is null"}
最后,访问带有权限认证的url, http://localhost:8080/cloud-service/ribbon/name?token=www.hanyahong.com
可以看到浏览器可以通过验证,进入了子系统中的API,并返回了相关结果。
千万之路刚开始-www.hanyahong.com-beijing该服务器端口8071