Zuul鉴权和添加用户服务

来实现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;}
}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部