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*/
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return FilterConstants.PRE_DECORATION_FILTER_ORDER-1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 前置逻辑写在run方法内
     * @return
     * @throws ZuulException
     */
    @Override
    public 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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值