一、达到的目标

/order/create 只能买家访问

/order/finish 只能卖家访问

/product/list 都能访问

二、创建User工程

1、创建user工程

选择的依赖

2、创建user-dev.yml文件到gitee(码云)

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.jdbc.Driver
  4. username: root
  5. password: 123456
  6. url: jdbc:mysql://127.0.0.1:3306/SpringCloud_Sell?characterEncoding=utf-8&useSSL=false
  7. jpa:
  8. show-sql: true  

3、然后在配置中心查看

4、创建bootstrap.yml

5、增加EnableDiscoveryClient注解

6、 pom.xml文件

增加spring-boot-starter-web

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-jpa</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-data-redis</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-starter-config</artifactId>
  13. </dependency>
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-config-client</artifactId>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  21. </dependency>
  22.  
  23. <dependency>
  24. <groupId>mysql</groupId>
  25. <artifactId>mysql-connector-java</artifactId>
  26. <scope>runtime</scope>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-web</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>
  38.  
  39. <dependencyManagement>
  40. <dependencies>
  41. <dependency>
  42. <groupId>org.springframework.cloud</groupId>
  43. <artifactId>spring-cloud-dependencies</artifactId>
  44. <version>${spring-cloud.version}</version>
  45. <type>pom</type>
  46. <scope>import</scope>
  47. </dependency>
  48. </dependencies>
  49. </dependencyManagement>

  

7、最后启动User工程

查看Eureka中心,可以看到User已经在了。

8. 然后将User工程进行模块拆分

二、api-gateway工程

1、修改api-gateway的配置。全部服务都可传递Cookie

三、增加权限验证

1、增加AuthFilter

  1. /**
  2. * 权限拦截(区分卖家和买家)
  3. * Created by Think on 2019/2/16.
  4. */
  5. @Component
  6. public class AuthFilter extends ZuulFilter{
  7.  
  8. @Autowired
  9. private StringRedisTemplate stringRedisTemplate;
  10. @Override
  11. public String filterType() {
  12. return PRE_TYPE;
  13. }
  14.  
  15. @Override
  16. public int filterOrder() {
  17. return PRE_DECORATION_FILTER_ORDER - 1;
  18. }
  19.  
  20. @Override
  21. public boolean shouldFilter() {
  22. return true;
  23. }
  24.  
  25. @Override
  26. public Object run() throws ZuulException {
  27. RequestContext requestContext = RequestContext.getCurrentContext();
  28. HttpServletRequest request = requestContext.getRequest();
  29.  
  30. /*
  31. /order/create 只能买家访问(cookei里有openid)
  32. /order/finish 只能卖家访问(cookie里有token,并且对应redis中的值)
  33. /product/list 都能访问
  34. */
  35.  
  36. if("/order/create".equals(request.getRequestURI())){
  37. Cookie cookie = CookieUtil.get(request, "openid");
  38. if(cookie == null || StringUtils.isEmpty(cookie.getValue())){
  39. requestContext.setSendZuulResponse(false);
  40. requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
  41. }
  42. }
  43.  
  44. if("/order/finish".equals(request.getRequestURI())){
  45. Cookie cookie = CookieUtil.get(request, "token");
  46. if(cookie == null || StringUtils.isEmpty(cookie.getValue()) ||
  47. StringUtils.isEmpty(stringRedisTemplate.opsForValue().get(String.format(RedisConstant.TOKEN_TEMPLATE,cookie.getValue())))){
  48. requestContext.setSendZuulResponse(false);
  49. requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
  50. }
  51. }
  52.  
  53. return null;
  54. }
  55. }

 

2、启动其它工程

3、测试

 以上返回是错误的,应该禁止访问。修改如下路径/order/order/create

  1. /**
  2. * 权限拦截(区分卖家和买家)
  3. * Created by Think on 2019/2/16.
  4. */
  5. @Component
  6. public class AuthFilter extends ZuulFilter{
  7.  
  8. @Autowired
  9. private StringRedisTemplate stringRedisTemplate;
  10. @Override
  11. public String filterType() {
  12. return PRE_TYPE;
  13. }
  14.  
  15. @Override
  16. public int filterOrder() {
  17. return PRE_DECORATION_FILTER_ORDER - 1;
  18. }
  19.  
  20. @Override
  21. public boolean shouldFilter() {
  22. return true;
  23. }
  24.  
  25. @Override
  26. public Object run() throws ZuulException {
  27. RequestContext requestContext = RequestContext.getCurrentContext();
  28. HttpServletRequest request = requestContext.getRequest();
  29.  
  30. /*
  31. /order/create 只能买家访问(cookei里有openid)
  32. /order/finish 只能卖家访问(cookie里有token,并且对应redis中的值)
  33. /product/list 都能访问
  34. */
  35.  
  36. if("/order/order/create".equals(request.getRequestURI())){
  37. Cookie cookie = CookieUtil.get(request, "openid");
  38. if(cookie == null || StringUtils.isEmpty(cookie.getValue())){
  39. requestContext.setSendZuulResponse(false);
  40. requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
  41. }
  42. }
  43.  
  44. if("/order/order/finish".equals(request.getRequestURI())){
  45. Cookie cookie = CookieUtil.get(request, "token");
  46. if(cookie == null || StringUtils.isEmpty(cookie.getValue()) ||
  47. StringUtils.isEmpty(stringRedisTemplate.opsForValue().get(String.format(RedisConstant.TOKEN_TEMPLATE,cookie.getValue())))){
  48. requestContext.setSendZuulResponse(false);
  49. requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
  50. }
  51. }
  52.  
  53. return null;
  54. }
  55. } 

然后API-Gateway工程中增加Redis配置

 这样再次请求在返回401.

先登录,在调用create 创建订单,则可以调用成功。

同理,测试finish接口

http://localhost:9000/order/order/finish,返回401

所以卖家先进行登录操作

在进行订单finish操作

4、优化。将AuthFilter拆分成AuthSellerFilter和AuthBuyerFilter

AuthBuyerFilter.java

  1. @Component
  2. public class AuthBuyerFilter extends ZuulFilter{
  3.  
  4. @Autowired
  5. private StringRedisTemplate stringRedisTemplate;
  6. @Override
  7. public String filterType() {
  8. return PRE_TYPE;
  9. }
  10.  
  11. @Override
  12. public int filterOrder() {
  13. return PRE_DECORATION_FILTER_ORDER - 1;
  14. }
  15.  
  16. @Override
  17. public boolean shouldFilter() {
  18. RequestContext requestContext = RequestContext.getCurrentContext();
  19. HttpServletRequest request = requestContext.getRequest();
  20.  
  21. if("/order/order/create".equals(request.getRequestURI())){
  22. return true;
  23. }
  24. return false;
  25. }
  26.  
  27. @Override
  28. public Object run() throws ZuulException {
  29. RequestContext requestContext = RequestContext.getCurrentContext();
  30. HttpServletRequest request = requestContext.getRequest();
  31.  
  32. /*
  33. /order/create 只能买家访问(cookei里有openid)
  34. */
  35. Cookie cookie = CookieUtil.get(request, "openid");
  36. if(cookie == null || StringUtils.isEmpty(cookie.getValue())){
  37. requestContext.setSendZuulResponse(false);
  38. requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
  39. }
  40.  
  41. return null;
  42. }
  43. }

  

  1. AuthSellerFilter.java
  1. @Component
  2. public class AuthSellerFilter extends ZuulFilter{
  3.  
  4. @Autowired
  5. private StringRedisTemplate stringRedisTemplate;
  6. @Override
  7. public String filterType() {
  8. return PRE_TYPE;
  9. }
  10.  
  11. @Override
  12. public int filterOrder() {
  13. return PRE_DECORATION_FILTER_ORDER - 1;
  14. }
  15.  
  16. @Override
  17. public boolean shouldFilter() {
  18. RequestContext requestContext = RequestContext.getCurrentContext();
  19. HttpServletRequest request = requestContext.getRequest();
  20. if("/order/order/finish".equals(request.getRequestURI())){
  21. return true;
  22. }
  23. return false;
  24. }
  25.  
  26. @Override
  27. public Object run() throws ZuulException {
  28.  
  29. RequestContext requestContext = RequestContext.getCurrentContext();
  30. HttpServletRequest request = requestContext.getRequest();
  31. /*
  32. /order/finish 只能卖家访问(cookie里有token,并且对应redis中的值)
  33. */
  34. Cookie cookie = CookieUtil.get(request, "token");
  35. if(cookie == null || StringUtils.isEmpty(cookie.getValue()) ||
  36. StringUtils.isEmpty(stringRedisTemplate.opsForValue().get(String.format(RedisConstant.TOKEN_TEMPLATE,cookie.getValue())))){
  37. requestContext.setSendZuulResponse(false);
  38. requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
  39. }
  40. return null;
  41. }
  42. }

  

Zuul权限检验的更多相关文章

  1. SpringCloud(8)---zuul权限校验、接口限流

    zuul权限校验.接口限流 一.权限校验搭建 正常项目开发时,权限校验可以考虑JWT和springSecurity结合进行权限校验,这个后期会总结,这里做个基于ZuulFilter过滤器进行一个简单的 ...

  2. Linux下进程的文件访问权限

    本文转自 http://blog.csdn.net/chosen0ne/article/details/10581883 对进程校验文件访问权限包括两个部分,一是确定进程的角色(属于哪个用户或者组), ...

  3. SpringCloud---网关概念、Zuul项目搭建(六)

    SpringCloud---网关概念.Zuul项目搭建(六) 一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控. ...

  4. [Z] Linux下进程的文件访问权限

    原文链接:http://blog.csdn.net/chosen0ne/article/details/10581883 对进程校验文件访问权限包括两个部分,一是确定进程的角色(属于哪个用户或者组), ...

  5. Django:RestFramework之-------权限

    4.restframework-权限 4.1权限: 权限在单个视图应用. class MyPermission(object): """认证类""&q ...

  6. SSM项目实战 之 权限管理系统

    目录 SSM权限管理系统 项目搭建 1.创建Maven-webapp工程 2.SSM框架集成 3.添加代码生成器 主页搭建 EasyUI主页 员工列表 1.在tree当中指定跳转的地址--暂时用tre ...

  7. 前后端分离进行权限管理之后端API返回菜单及权限信息(三)

    一.动态菜单API的生成 1.API #菜单信息 url(r'^menus$', views.MenuModelView.as_view({"get": "list&qu ...

  8. springboot使用jwt进行权限验证

    springboot使用jwt进行权限验证 依赖准备 首先导入对应的依赖 <dependencies> <dependency> <groupId>org.apac ...

  9. spring aop注解配置

    spring aop是面向切面编程,使用了动态代理的技术,这样可以使业务逻辑的代码不掺入其他乱七八糟的代码 可以在切面上实现合法性校验.权限检验.日志记录... spring aop 用的多的有两种配 ...

随机推荐

  1. 多路径multipath配置,udev绑定

    多路径multipath配置 以root用户登录 1.查看共享磁盘是否挂载成功 #fdisk -l 2.生成配置文件 #mpathconf --enable 修改配置文件权限 #chmod 644 / ...

  2. arch Linux 安装完,无法通过 SSH 远程连接 root 用户问题

    访问 arch Linux 主机的该文件 [root@eric-laptop ~]# vim /etc/ssh/sshd_config 对应注释部分后边补上下边三行: LoginGraceTime 1 ...

  3. Python requests代理

    self.ip=requests.get('http:ip获取') self.ip=(self.ip.text).replace('\r','').replace('\n','') print('IP ...

  4. Session&Cookie(Introduction、Application)

    一Session 1概念: (1)session是会话,是同一连接者所有页面公有的内置对象   (2)session是一段时间,从session创建开始,到session销毁结束,默认时间为30分钟( ...

  5. struts2必备jar包(2.1.6版本)

    struts2必备jar包(2.1.6版本) struts2(2.1.6版本)必备的jar包有6个 struts2-core-2.1.6.jar freemarker-2.3.13.jar commo ...

  6. Linux下TFTP服务的安装、配置和操作

      TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现.嵌入式linux的tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp ...

  7. Let me introduce myself

    介绍自己,从开学到这上半学期结束,不知道说了多少个版本.开学军训,要自我介绍:军训结束,在班里要自我介绍:参加社团,面试要自我介绍.....不能说对每个人,至少对于我来说,在众人面前开口介绍自己,总还 ...

  8. UDP协议学习(转)

    reference: https://blog.csdn.net/s_lisheng/article/details/73538229                  https://blog.cs ...

  9. go web framework gin 启动流程分析

    最主要的package : gin 最主要的struct: Engine Engine 是整个framework的实例,它包含了muxer, middleware, configuration set ...

  10. 编译darknet出现libpng16.so.16:对‘inflateValidate@ZLIB_1.2.9’未定义的引用

    cd /usr/lib/x86_64-linux-gnu sudo ln -s ~/anaconda/lib/libpng16.so.16 libpng16.so.16 sudo ldconfig## ...