来实现Zuul的权限校验,我们要实现下面三个功能,看第一个api,叫/order/create,创建订单,这个API只能由买家来访问,第二个是order/finish,这是完结订单,这个API我们之前还没有写,待会我们来写一下,买家下单之后,那么卖家来接单,接单之后这个状态要置为完结状态,就是使用这个API,第三个是/product/list,这是获取商品的列表,第三个接下来就结合项目,之前写了一个TokenFilter,这里也是一个校验,它是一个PRE类型,我们先把之前的token拦截给他注释掉,@Override
public Object run() {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();//这里从url参数里获取, 也可以从cookie, header里获取String token = request.getParameter("token");if (StringUtils.isEmpty(token)) {
//            requestContext.setSendZuulResponse(false);
//            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null;
}现在再来新建一个权限的校验,我们可以复制一下TokenFilter,主要要对三个API做不同的处理,/order/create这是创建订单,只能买家访问,finish只能卖家访问,product/list都可访问,待会我们功能就要写到这个地方,那么我们来想一下,怎么样才区分买家和卖家呢,无非这两者的目的就是区分这两者,有朋友可能会说,通过cookie,既然能够想到cookie的话,那必须先登录了之后,才能获取到他们的信息,那登录功能又应该写到哪儿呢,这肯定是应该写到一个用户服务里面,所以接下来我们要创建一个用户服务,那这个用户服务我们先也不着急创建,我们先来分析一下,他应该有哪些功能,数据库表应该是什么样子的,这里我写了一份API,这里有一个买家登陆和卖家登陆的接口,我们先看看买家登陆,这是一个GET请求,login.buyer,参数是openid,abc只是一个例子,看一下返回,返回会返回一个JSON的数据,返回的同时后端代码会做一个事情,就是设置cookie里面设置openid等于abc,也就是把内容设置到cookie里面去,那这个登陆接口大家可能会觉得比较奇怪,openid是什么东西,我们这个登陆和传统的使用账号和密码登陆其实是不大一样的,点餐的服务登陆是使用的微信的授权,授权之后可以从微信那儿获取到用户的唯一标识,叫做openid,他的内容就是惟一的,我们使用这个来进行登陆,我这个依旧这么设计呢,是为了最大化的保持一致,这样也方便大家理解,其实重点在于什么呢,重点就是返回的时候,他要在cookie里面设置这么一个内容,看一下卖家登陆,卖家登陆也是使用了微信的授权,用到了微信的扫码登陆,就是授权,就是获取openid,这里为了区别我故意写了一个xyz,也是openid的具体内容,当时我们卖家登陆,返回的时候做了一件事情,有别于买家登陆,卖家登陆设置值为token=uuid,UUID也是JAVA代码后端生成的,同时也会在redis里面设置一个值,key就等于前面的uuid,value是里面的内容,xyz,注意要注意的就是这两点,看一下数据库,数据库就非常简单了,也是为了尽量保持一致-- 用户
CREATE TABLE `user_info` (`id` varchar(32) NOT NULL,`username` varchar(32) DEFAULT '',`password` varchar(32) DEFAULT '',`openid` varchar(64) DEFAULT '' COMMENT '微信openid',`role` tinyint(1) NOT NULL COMMENT '1买家2卖家',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;表名user_info,username和password我们暂时用不到,我只是设计的时候先这么设计进去,这里有一个openid,这里有一个字段叫role,1是买家,2是卖家,就是通过这个来判断,数据库也非常的简单,接下来我们就来创建user项目,首先ereka和config要选上,我们要用到配置Config Client,数据库也要用到,还有我们会操作Redis,基本上先这些user我们这里用到了数据库和Redis,数据库和Redis,新建user的一个配置文件,我们使用order-test.yml拷贝一份过去,我们只需要配数据库和Redis,这上面写完是没有提示的,大家要测试一下,避免写错,我们看一下测试文件有没有问题,我们先通过配置中心看一下配置是否有问题localhost:8080/user-dev.yml这样子可以出来,格式是没有问题的,我们来启动一下user这个项目59.110.138.145:8761已经成功启动了,因为我们之前的订单还有商品,这两个服务都用了多模块,像user这样的服务肯定是会对外提供接口的,所以我们这里也把他改成多模块,我们目前只用到server这个模块,以后要提供接口就使用client模块
package com.learn.cloud.filter;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpStatus;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;import com.learn.cloud.utill.CookieUtil;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;/*** 权限拦截 区分买家和卖家*/
@Component
public class AuthFilter extends ZuulFilter {/*FilterConstants*/@Overridepublic String filterType() {return FilterConstants.PRE_TYPE;}@Overridepublic int filterOrder() {return FilterConstants.PRE_DECORATION_FILTER_ORDER-1;}@Overridepublic boolean shouldFilter() {return true;}/*** 前置逻辑写在run方法内* @return* @throws ZuulException*/@Overridepublic Object run() {RequestContext requestContext= RequestContext.getCurrentContext();HttpServletRequest request= requestContext.getRequest();//create 只能买家访问//finish 只能卖家访问//list 都可访问if("/product/productInfo".equals(request.getRequestURI())){//cookie为空认为没有权限Cookie cookie = CookieUtil.get(request,"openid");if (cookie==null || StringUtils.isEmpty(cookie.getValue())){requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);}}return null;}
}
package com.learn.cloud.utill;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class CookieUtil {/*** 设置cookie* @param response* @param name* @param value* @param maxAge*/public static void set(HttpServletResponse response,String name,String value,int maxAge){Cookie cookie =new Cookie(name,value);cookie.setPath("/");cookie.setMaxAge(maxAge);response.addCookie(cookie);}/*** 获取cookie* @param request* @param name* @return*/public static Cookie get(HttpServletRequest request,String name){Cookie[] cookies = request.getCookies();if(cookies!=null){for (Cookie cookie:cookies){if (name.equals(cookie.getName())){return cookie;}}}return null;}
}

Zuul鉴权和添加用户服务相关推荐

  1. No6-6.从零搭建spring-cloud-alibaba微服务框架,添加用户鉴权逻辑,动态数据权限(使用AOP实现)等(六,no6-6)

    代码地址与接口看总目录:[学习笔记]记录冷冷-pig项目的学习过程,大概包括Authorization Server.springcloud.Mybatis Plus~~~_清晨敲代码的博客-CSDN ...

  2. Spring Cloud【Finchley】-03将微服务注册到Eureka Server上 + 为Eureka Server添加用户认证

    文章目录 概述 将用户微服务micorservice-provider-user注册到Eureka Server上 pom中增加 spring-cloud-starter-netflix-eureka ...

  3. mongdb 鉴权失败,添加用户数据失败

    看一下报错,我这边是创建用户时报的错 > db.createUser({user:"admin",pwd:"123456789",roles:[" ...

  4. zuul网关找不到服务_网关zuul中对所有下游服务权限做控制zuulauth

    在单体应用架构下,常见的用户-角色-菜单权限控制模式,譬如shiro,就是在每个接口方法上加RequireRole,RequirePermission,当调用到该方法时,可以从配置的数据库.缓存中来进 ...

  5. SpringCloud(第 025 篇)Zuul 路由后面的微服务挂了后,Zuul 提供了一种回退机制来应对熔断处理...

    2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 025 篇)Zuul 路由后面的微服务挂了后,Zuul 提供了一种回退机制来应对熔断处理 一.大致 ...

  6. arch linux添加用户,Users and groups (简体中文)

    翻译状态:本文是 Users_and_Groups 的翻译.上次翻译日期:2020-06-16.如果英文版本有所更改,则您可以帮助同步翻译. GNU/Linux 通过用户和用户组实现访问控制 -- 包 ...

  7. 认证、授权、鉴权和权限控制

    原文地址 https://www.cnblogs.com/badboyh2o/p/11068779.html 如有侵权,请联系删除,谢谢! 本文将对信息安全领域中认证.授权.鉴权和权限控制这四个概念给 ...

  8. 蓝牙安全管理(Security Manager,SM)之配对、鉴权和加密

    内容来自蓝牙核心规范V5.1 Vol3 PartH,若有错误之处,希望指出来 SM定义了管理配对.鉴权和加密的协议和行为,适用于LE-only单模设备或BR/EDR/LE双模设备. 0.蓝牙安全概述 ...

  9. 认证、授权、鉴权和权限控制概念区别

    1.认证: 认证是指根据声明者所特有的识别信息,确认声明者的身份.认证在英文中对应于identification这个单词. 最常见的认证实现方式是通过用户名和密码,但认证方式不限于此.下面都是当前常见 ...

最新文章

  1. Smart Paster...great tool to paste large strings into Vs.net
  2. sqli-labs\Less 25~30
  3. 火焰传感器感应有火亮灯代码_智能无线感应灯火了,光感人感2种传感器感应,做照明品牌的几光...
  4. VMmware安装VMware Tools问题解决
  5. Exchange2003/2010共存模式环境迁移
  6. SpringMVC 异常的处理
  7. 打开access文件 提示文件名无效_分享在PS软件打开图像时提示无效的JPEG的解决方法...
  8. Java 移位操作符
  9. 计算机毕业设计java+ssm校园在线投票系统(源码+系统+mysql数据库+Lw文档)
  10. 安装完固态硬盘后计算机里没显示,安装了双硬盘电脑却不显示新硬盘怎么办
  11. 使用 Docker 部署 Prometheus + Grafana 监控平台
  12. c++的构造函数赋值函数重载运算符等
  13. Qt实现最小化窗口到托盘图标
  14. 算法工程师的三个境界
  15. M: Triangular Relationship (数论)
  16. python基础练习题与期末复习总结
  17. java期末程序填空_Java后端期末复习
  18. Android CMWAP和CMNET 切换APN
  19. android概述和环境搭建
  20. 小程序textarea完美填坑

热门文章

  1. Sqlite 错误码
  2. 【Redis学习】Redis数据类型及存储结构
  3. Python——赋值、浅拷贝、深拷贝
  4. WinForm加载外部类库项目的集成开发模式
  5. 导出Excel java
  6. LVS+OSPF 架构
  7. android之SharedPreferences
  8. VC++多线程编程[转]
  9. MOS2010的界面介绍和定制方法简介【资料汇集】
  10. oracle rownum 学习