Zuul网关服务zuulFilter / 怎么把数据传到controller中?微服务间的token传递?

shaft_V 2019-03-22 10:17:12
例如一个删除信息接口 需要传递 infoId 和 userId.
controller中的infoDel(Long infoId,Long userId);
怎么确保userId是请求者的id 而不是 用户乱填的. 原来可能是在infoDel方法里加个HttpServletRequest参数 或者 token参数,
然后根据token 从redis取出user 判断下 两个userId相不相等

而在微服务下 怎么验证 请求的权限/数据权限?
各个服务之间的调用, 是把token一路传下去吗?
例如查询接口, 怎么确保查的都是用户权限范围内的可看数据?

请问有坛友知道吗,能不能帮我解答下. 谢谢.
...全文
1900 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
LC-1031 2019-10-15
  • 打赏
  • 举报
回复 1
看了博主文章,遇到同样问题,我也用的是zuul,我用的是ZuulFilter,这是我找到的方法 RequestContext ctx = RequestContext.getCurrentContext(); ctx.addZuulRequestHeader("test", "xxxxxx");
shaft_V 2019-03-26
  • 打赏
  • 举报
回复
引用 14 楼 qps2009 的回复:
我个人的理解是这样的:比如某个微服务的infoDel(Long infoId,Long userId)这个方法需要用到userId,zuulFilter 对token验证后(只要验证通过后,那么这个token肯定是合法的,你之前说的根据token 从redis取出user 判断下 两个userId相不相等,这一步应该可以判断),再从token里面解析出userId,当作参数调用infoDel(Long infoId,Long userId),即这个时候就要修改请求的参数,具体方法需要获取request,然后根据请求的方式修改request的参数,这部分可以直接百度“zuul修改请求参数”关键字应该搜索到
谢谢,有效.过滤器能过滤修改参数了. 等我能较正常跑起来,再总结下...
qps2009 2019-03-25
  • 打赏
  • 举报
回复
引用 13 楼 shaft_V 的回复:
[quote=引用 12 楼 qps2009 的回复:] Zuul不是可以直接路由到具体的服务吗?路由所有服务,只暴漏Zuul对外,然后直接在Zuul里面完成token验证,只要验证成功,就把验证成功后从token里面解析的信息(比如userId)带着去请求相应的服务就行了
谢谢帮助. 是,最近看了些博客, 都是在zuul 完成token验证(或者转到验证服务器验证?), 然后再转发到其他服务,(其他服务之间调用不用验证.). 我对验证成功,把token信息解析出来之后, 如何 "把参数如何传递到其他服务,其他服务如何接收信息 "不太明白, 像addZuulRequestHeader("user",new User() / userId) 这种, 其他服务 的controller方法不是需要添加HttpservletRequest参数了吗? [/quote] 我个人的理解是这样的:比如某个微服务的infoDel(Long infoId,Long userId)这个方法需要用到userId,zuulFilter 对token验证后(只要验证通过后,那么这个token肯定是合法的,你之前说的根据token 从redis取出user 判断下 两个userId相不相等,这一步应该可以判断),再从token里面解析出userId,当作参数调用infoDel(Long infoId,Long userId),即这个时候就要修改请求的参数,具体方法需要获取request,然后根据请求的方式修改request的参数,这部分可以直接百度“zuul修改请求参数”关键字应该搜索到
shaft_V 2019-03-25
  • 打赏
  • 举报
回复
引用 12 楼 qps2009 的回复:
Zuul不是可以直接路由到具体的服务吗?路由所有服务,只暴漏Zuul对外,然后直接在Zuul里面完成token验证,只要验证成功,就把验证成功后从token里面解析的信息(比如userId)带着去请求相应的服务就行了
谢谢帮助. 是,最近看了些博客, 都是在zuul 完成token验证(或者转到验证服务器验证?), 然后再转发到其他服务,(其他服务之间调用不用验证.). 我对验证成功,把token信息解析出来之后, 如何 "把参数如何传递到其他服务,其他服务如何接收信息 "不太明白, 像addZuulRequestHeader("user",new User() / userId) 这种, 其他服务 的controller方法不是需要添加HttpservletRequest参数了吗?
qps2009 2019-03-25
  • 打赏
  • 举报
回复
Zuul不是可以直接路由到具体的服务吗?路由所有服务,只暴漏Zuul对外,然后直接在Zuul里面完成token验证,只要验证成功,就把验证成功后从token里面解析的信息(比如userId)带着去请求相应的服务就行了
931828653 2019-03-22
  • 打赏
  • 举报
回复
单独写一个 微服务 , @Configuration public class GateWayCorsConfig { @Bean public FilterRegistrationBean corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; } }
shaft_V 2019-03-22
  • 打赏
  • 举报
回复
引用 2 楼 931828653 的回复:
我们用的是 gateway
zuul 和 gateway 都是刚刚接触, gateway没配置成功跑不起来. 转发到其他服务时候,到底转发了什么.. token/user对象/userId传递过去 子服务请问该怎么获取? 比较疑惑的是,@FeignClient注解下的RPC类中的方法都不含有httpservletRequest或token参数 ,那怎么确保要查询要删除的是他自己底下的数据..
shaft_V 2019-03-22
  • 打赏
  • 举报
回复
引用 1 楼 931828653 的回复:
就是加请求头,token校验 在请求头里自定义一个字段来传输token值,并且接收响应头里的自定义字段token值 corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址            corsConfiguration.addAllowedHeader("token"); // 2 设置访问源请求头   corsConfiguration.addAllowedMethod("POST,GET"); // 3 设置访问源请求方法            corsConfiguration.setMaxAge(1800000L);//间隔30分钟验证一次是否允许跨域 response.setHeader("Access-Control-Expose-Headers","Cache-Control,Content-Type,Expires,Pragma,Content-Language,Last-Modified,token"); response.setHeader("token", JwtToken.createToken(user.getId())); //设置响应头 Expose-Headers","Cache-Control,Content-Type,Expires,Pragma,Content-Language,Last-Modified,token"); response.setHeader("token", JwtToken.createToken(user.getId())); //设置响应头
谢谢帮助. response.setHeader("token", JwtToken.createToken(user.getId())); //设置响应头 这个user对象是在哪里获取? 这段应该写在哪里? controller中 还是作为config包下? 其他服务接收时, controller 方法里要添加request参数吗
931828653 2019-03-22
  • 打赏
  • 举报
回复
我们用的是 gateway
931828653 2019-03-22
  • 打赏
  • 举报
回复
就是加请求头,token校验 在请求头里自定义一个字段来传输token值,并且接收响应头里的自定义字段token值 corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址            corsConfiguration.addAllowedHeader("token"); // 2 设置访问源请求头   corsConfiguration.addAllowedMethod("POST,GET"); // 3 设置访问源请求方法            corsConfiguration.setMaxAge(1800000L);//间隔30分钟验证一次是否允许跨域 response.setHeader("Access-Control-Expose-Headers","Cache-Control,Content-Type,Expires,Pragma,Content-Language,Last-Modified,token"); response.setHeader("token", JwtToken.createToken(user.getId())); //设置响应头 Expose-Headers","Cache-Control,Content-Type,Expires,Pragma,Content-Language,Last-Modified,token"); response.setHeader("token", JwtToken.createToken(user.getId())); //设置响应头
shaft_V 2019-03-22
  • 打赏
  • 举报
回复
引用 10 楼 stacksoverflow 的回复:
根据你业务需要, 一般在认证工作全部在网管完成,所以,认证失败后可以直接从网关返回,不去请求后续的服务。 怎么确保他的参数是属于他自己的,合理的。这个有很多方法,比如jwt认证把用户信息编码后发到客户端,回来再解码验证,具体根据你的业务走。 spring框架范围内的话,后面的request参数有无应该是都一样。 我们做的网关到微服务的调用不需要考虑feigin等实现方式,直接从网管路由到具体的服务,如果网管中的认证,限流等关口没过直接返回。 过了网关就是带着角色去请求一级服务。 一级服务到二级服务请求才会用feigin,dubbo等调用方式,而二级服务不会带有http的信息,都是业务接口。 作为参考,考虑一下。
原来如此.. 清晰多了,谢谢大佬解答,我去找些资料项目 实践下
stacksoverflow 2019-03-22
  • 打赏
  • 举报
回复
根据你业务需要, 一般在认证工作全部在网管完成,所以,认证失败后可以直接从网关返回,不去请求后续的服务。 怎么确保他的参数是属于他自己的,合理的。这个有很多方法,比如jwt认证把用户信息编码后发到客户端,回来再解码验证,具体根据你的业务走。 spring框架范围内的话,后面的request参数有无应该是都一样。 我们做的网关到微服务的调用不需要考虑feigin等实现方式,直接从网管路由到具体的服务,如果网管中的认证,限流等关口没过直接返回。 过了网关就是带着角色去请求一级服务。 一级服务到二级服务请求才会用feigin,dubbo等调用方式,而二级服务不会带有http的信息,都是业务接口。 作为参考,考虑一下。
shaft_V 2019-03-22
  • 打赏
  • 举报
回复
引用 8 楼 stacksoverflow 的回复:
1. Controller的方法最后加一个参数HttpServletRequest request 这么得到传来的头 request.getHeader("authId") 2.不用传null,spring只自动匹配你的参数,找到对应的方法,加不加request都会掉。 3.网关和其他服务都调用同一个服务的话,考虑你的设计是不是有问题。 服务分上下游服务,网关调用的是上游服务。
@FeignCilent public interface OrderRPC{... controller的方法声明} 其他服务要调用它 会在自己的serviceImpl 里 @Resource OrderRPC orderRPC 然后 调用对应方法..(参数列表和controller方法一致) 例如: 第一次访问 没有token,在网关里拦截, 然后报错 或者跳转到登陆页面? 输入用户名密码 成功 获取token; 再次访问网关,验证token, 放行, 把信息addZuulRequestHeader("user",new User()). 然后再 订单服务的controller里获取request的Header 是这样吗? 我还是有疑问, 从外面进入 网关时 如果通过了(这个具体验证,我是觉得验证一下token在不在redis) 怎么确保他的参数是属于他自己的,合理的,像删除的操作,在controller里加个request参数, 那如果其他服务rpc调用这个删除操作(缺少request参数,spring会自动匹配吗) 我还是见识太少,我自己去新建个项目实际操作下... 谢谢你的帮助;..
stacksoverflow 2019-03-22
  • 打赏
  • 举报
回复
引用 7 楼 shaft_V 的回复:
[quote=引用 6 楼 stacksoverflow 的回复:] 原来怎么做,现在还怎么做,把逻辑放到zuul网关里就行了, 认证的话,如果没有特殊需要,在网关认证一下就行了,过了网关就认为都是正常请求,不需要认证。 网关往微服务里传消息(比如用户ID)可以通过加header的方式。 RequestContext ctx = RequestContext.getCurrentContext(); ctx.addZuulRequestHeader("authId:", "GUEST");
谢谢. 那通过了这个网关, 子服务接收请求时 controller里怎么取出authorId? controller方法里加上HttpservletRequest request 参数 然后从request参数中获取吗?(如果这样的话, 那其他服务 feign调用 该服务时 是不是要传个 null值request)[/quote] 1. Controller的方法最后加一个参数HttpServletRequest request 这么得到传来的头 request.getHeader("authId") 2.不用传null,spring只自动匹配你的参数,找到对应的方法,加不加request都会掉。 3.网关和其他服务都调用同一个服务的话,考虑你的设计是不是有问题。 服务分上下游服务,网关调用的是上游服务。
shaft_V 2019-03-22
  • 打赏
  • 举报
回复
引用 6 楼 stacksoverflow 的回复:
原来怎么做,现在还怎么做,把逻辑放到zuul网关里就行了, 认证的话,如果没有特殊需要,在网关认证一下就行了,过了网关就认为都是正常请求,不需要认证。 网关往微服务里传消息(比如用户ID)可以通过加header的方式。 RequestContext ctx = RequestContext.getCurrentContext(); ctx.addZuulRequestHeader("authId:", "GUEST");
谢谢. 那通过了这个网关, 子服务接收请求时 controller里怎么取出authorId? controller方法里加上HttpservletRequest request 参数 然后从request参数中获取吗?(如果这样的话, 那其他服务 feign调用 该服务时 是不是要传个 null值request)
stacksoverflow 2019-03-22
  • 打赏
  • 举报
回复
原来怎么做,现在还怎么做,把逻辑放到zuul网关里就行了, 认证的话,如果没有特殊需要,在网关认证一下就行了,过了网关就认为都是正常请求,不需要认证。 网关往微服务里传消息(比如用户ID)可以通过加header的方式。 RequestContext ctx = RequestContext.getCurrentContext(); ctx.addZuulRequestHeader("authId:", "GUEST");

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧