使用zuul实现验证自定义请求头中的token
路由:她会把外部所有对请求转发到具体的微服务实例上,是实现外部访问同一接口的基础
过滤: 就是权限的检查, 判断当前的请求是否有权限区访问那些服务集群
搭建后台网关:
导入eureka - client, 它本身也是一个客户端,需要注册进eureka
- 导入网关的包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
过滤器, 重写下面的ZuulFilter可以实现自定义的过滤规则, 每个方法的含义都通过注释的方式写在了方法头
网关的过滤器
@Component
public class WebManagerFilter extends ZuulFilter {
/**
* 指定过滤器的类型
pre :可以在请求被路由之前调用
route :在路由请求时候被调用
post :在route和error过滤器之后被调用
error :处理请求时发生错误时被调用
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 指定过滤器的优先级, 0表示优先执行, 因为我们可以写很多个过滤器
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 当前过滤器是否开启, true表示开启
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器执行逻辑, 返回任意Object类型的值,都表示放行,包括null
* 如果不想往后继续执行了,就使用 setSendZullResponse(false)
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
System.out.println("经过了后台的过滤器");
return null;
}
}
我们可以通过RequestContext的实例对象,获取出请求头,请求parms,请求ip等信息, 针对不同的信息可以做出不同的处理
黑白名单
比如我们可以在网关中禁用掉恶意访问的ip地址
验证权限
如果项目是前后端分离使用jwt等工具生成token放在请求头中做安全验证,我们也能在网关中对请求头做出初步解析处理
防止抓包
还能根据用户请求中发送过来的请求参数做验证签名处理, 防止数据在传输过程中被恶意篡改
此外,网关会过滤掉一些请求的请求头,如果请求头是我们自己定义的,就比如下面的Authrization, 经过网关后的请求的头信息会丢失,进而导致下面的这段代码失效, 获取不出头信息,就没办法验证token的合法性
解决办法: 选着添加添加一条配置信息 sensitive-headers:
将这个配置置空,意为清空网关要过滤的请求头
RequestContext currentContext = RequestContext.getCurrentContext();
String header = currentContext .getRequest().getHeader("Authorization");
System.err.println("zull header "+header);
// 判断是否存在header
if (!"".equals(header)&&header!=null){
System.err.println("转发header");
currentContext.addZuulRequestHeader("Authorization",header);
}
使用过滤器做验证的逻辑如下,验证携带在请求头中的token信息如下:
这个方法的特点就是, 只要他能在遇到 return null
就表示成功完成了验证的逻辑
1. 导入 common,我们要使用它的jwtUtil
@Override
public Object run() throws ZuulException {
System.err.println("经过了后台的过滤器");
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
// 获取出请求头
String header = request.getHeader("Authorization");
// 放行zuul的第一次请求 todo 我并没有触发这个方法的执行
if (request.getMethod().equals("OPTIONS")){
System.err.println("OPTIONS");
return null;
}
// 放行登录请求
if (request.getRequestURL().indexOf("login")>0){
return null;
}
if (StringUtils.isNotBlank(header)){
if (header.startsWith("Bearer ")){
String token = header.substring(7);
if (StringUtils.isNotBlank(token)){
System.out.println("token=="+token);
try{
Claims claims = jwtUtil.parseJWT(token);
String roles =(String) claims.get("roles");
System.out.println("roles=="+roles);
// 对admin放行,
if (roles.equals("admin")){
return null;
}
// todo 转发头信息,我改了配置文件, 让zuul不过滤任何头信息
// 其他情况, 终止访问
currentContext.setSendZuulResponse(false);
}catch (Exception e){
// 解析token出现的异常,说明token有问题, 终止本次请求
System.out.println("token出错了,终止本次访问: "+e);
currentContext.setSendZuulResponse(false);
}
}
}
}
currentContext.setSendZuulResponse(false);
currentContext.getResponse().setContentType("text/html;chatset=utf-8");
try {
currentContext.getResponse().getWriter().write("权限不足");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
使用zuul实现验证自定义请求头中的token的更多相关文章
- 自定义请求头信息及cookie信息
请求网页的时候有时候我们需要传递一些参数信息,这个时候我们可以将参数放到请求头中,具体使用如下: 这里有小问题就是请求参数的属性名好像不支持下划线,即 HTTP_UID不可用,但是HTTP-UID就可 ...
- Http 请求头中的 Proxy-Connection
平时用 Chrome 开发者工具抓包时,经常会见到 Proxy-Connection 这个请求头.之前一直没去了解什么情况下会产生它,也没去了解它有什么含义.最近看完<HTTP 权威指南> ...
- 使用 Spring RestTemplate 调用 rest 服务时自定义请求头(custom HTTP headers)
在 Spring 3.0 中可以通过 HttpEntity 对象自定义请求头信息,如: private static final String APPLICATION_PDF = "app ...
- shiro 获取请求头中的 sessionId
前言: 在前后端项目中, 前端有可能会要求, 后台返回一个 sessionId 给他, 然后他在请求后台接口时, 把这个sessionId 带给后台, 后台拿到这个sessionId , 就能识别, ...
- Python3 自定义请求头消息headers
Python3 自定义请求头消息headers 使用python爬虫爬取数据的时候,经常会遇到一些网站的反爬虫措施,一般就是针对于headers中的User-Agent,如果没有对headers进行设 ...
- HTTP 请求头中的 X-Forwarded-For(转)
原文:https://imququ.com/post/x-forwarded-for-header-in-http.html 我一直认为,对于从事 Web 前端开发的同学来说,HTTP 协议以及其他常 ...
- post请求头中常见content-type(非常重要)
定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码.默认地,表单数据会编码为 "application/x-www-form-urlencoded". ...
- 解决SpringCloud使用Feign跨服调用时header请求头中的信息丢失
在使用SpringCloud进行Feign跨服调用时header请求头中的信息会丢失,是因为Feign是不会带上当前请求的Cookie信息和头信息的,这个时候就需要重写请求拦截. 1.需要重写Requ ...
- ASP.NET Core - 实现Http自定义请求头策略
前言 在正常的情况下,当我们系统用到JWT认证方式时,需要在Http请求头添加Authorization: XXX,这样在后台服务的控制器中打上[Authorize]授权标签,就限定所有的请求必须通过 ...
随机推荐
- 使用SQLserver Management Studio连接VS2012自带数据库
下载 Microsoft® SQL Server® 2008 Management Studio Express http://www.microsoft.com/zh-CN/download/det ...
- Text 尺寸获取
获取text在当前文本内容下应该尺寸: 宽度:text.preferredWidth 高度:text.preferredHeight
- 快速搭建spring boot2.0 项目
快速搭建spring boot2.0+mybatis+thymeleaf 项目 使用工具STS 3.9.7(eclipse) 首先创建一个spring boot2.0项目(具体创建方法就不写了) 然后 ...
- 从java到python
从java到python 从事java开发主要是web方向,这个方向已经相当成熟,基本你想开发什么样的app,总能百度出来相关的项目或者github中搜索到,你需要做的就是掌握调试的技巧,基本你能想到 ...
- Flask:第一个Flask项目
在上一篇文章:Flask:项目的准备工作中,我写了flask项目的准备工作,不清楚创建flask项目需要做哪些准备的朋友可以点击链接看看 1.最简单的Flask项目 代码: from flask im ...
- 在线API文档管理工具Simple doc
Simple doc是一个简易的文档发布管理工具,为什么要写Simple doc呢?主要原因还是github的wiki并不好用:没有目录结构,文章没有Hx标签索引,最悲剧的是文章编辑的时候不能直接图片 ...
- Oracle 相关操作SQL
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,l.os_user_name,s.machi ...
- [考试反思]1029csp-s模拟测试93:殇逝
并不是把它消成上三角矩阵 停止! 思考, 回顾. 疑惑? 遗忘… 一直只是在匆忙的赶进度,实际上的确是一点也不扎实. T1,裸的偏序,想了一个多小时什么也没想到,只打了$O(n^2)$ 难道之前学的就 ...
- [考试反思]0908NOIP模拟测试40:颠簸
怎么说呢?好像也没什么可说的. 把我的优缺点都表现出来了的一场考试. T3是个小的dp想出来就能打,打出来就能A.我上来过了一遍题目觉得T3最简单(然而也并不是很简单) 然后就开始打,交,其实已经A了 ...
- PHP防止客户端多次点击
PHP防止客户端多次点击 第一种用ip判断 第二种就是用 用户名第三种就是cookie仅限 H5第四种 用swoole 用swoole id