前面实现了简单的zuul服务,那么这样的情况下任何知道地址的人都可以直接来访问接口
那么这边可以通过zuul的过滤器来进行权限控制
一 : 这边定义了一个Zuul过滤器,实现了在请求被路由之前检查请求头中是否有ACCESS_TOKEN参数,有就放行,没有就执行拦截
二 : 定义一个类继承ZuulFilter
package cn.sh.daniel.zuul;
import com.netflix.zuul.ZuulFilter;
public class ZuulAccessFilter extends ZuulFilter {
@Override
public boolean shouldFilter() {
return false;
}
@Override
public Object run() {
return null;
}
@Override
public String filterType() {
return null;
}
@Override
public int filterOrder() {
return 0;
}
}
filterType: 指定过滤器的类型
1: pre 在请求被路由前调用,可以利用此过滤器来验证角色权限,记录请求日志
2:routing: 这种过滤器将请求路由到微服务
3:post 过滤器在路由到微服务后执行,这种过滤器用来添加响应的http header,收集统计信息,将响应从微服务发送到客户端
4:error 在其他阶段发生错误时执行该过滤器
filterOrder: 过滤器的执行顺序
shouldFilter: 返回一个布尔值来表示此过滤器是否要执行,true执行,false不执行
Run: 过滤器的具体逻辑
三 : 重写具体的逻辑
package cn.sh.daniel.zuul;
import javax.servlet.http.HttpServletRequest;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
public class ZuulAccessFilter extends ZuulFilter {
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getHeader("accessToken");
if (accessToken == null) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
return null;
}
return null;
}
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
}
四 : 实例化过滤器
package cn.sh.daniel;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import cn.sh.daniel.zuul.ZuulAccessFilter;
@SpringBootApplication
@EnableZuulProxy //添加注解支持网关路由
public class CloudShopGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(CloudShopGatewayApplication.class, args);
}
@Bean
public ZuulAccessFilter accessFilter() {
return new ZuulAccessFilter();
}
}
五 : 启动网关服务测试
1)请求头没有token的情况
2)请求头有token的情况