soringcloud接口鉴权_springcloud服务网关--权限校验

1.实现如下三个功能:

73826c3d69f32351ed8c43b77dfdb1e0.png

2.买家登陆api

b3fa57df5c7cf0fd1f2acd2302a7a63a.png

3.卖家登陆

6df7cb9ed93e913999101af73530556f.png

4.构建user服务 模拟买家登陆和卖家登陆

package com.zhu.user.controller;

import com.zhu.user.entity.UserInfo;

import com.zhu.user.service.IUserInfoService;

import com.zhu.user.utill.CookieUtil;

import com.zhu.user.utill.Result;

import com.zhu.user.utill.ResultEnum;

import com.zhu.user.utill.ResultUtil;

import lombok.extern.log4j.Log4j;

import org.apache.commons.lang.StringUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.util.UUID;

import java.util.concurrent.TimeUnit;

/**

*

* 前端控制器

*

*

* @author pacey

* @since 2019-02-11

*/

@Log4j

@RestController

@RequestMapping("/userInfo")

public class UserInfoController {

@Autowired

private IUserInfoService iUserInfoService;

// 操作redis

@Autowired

private StringRedisTemplate stringRedisTemplate;

/**

* 买家登陆

* @param openid

* @param response

* @return

*/

@GetMapping("/buyer")

public Result LoginByBuyer(@RequestParam("openid") String openid, HttpServletResponse response)

{

log.info("buyer openid"+openid);

//1.openid和数据库的匹配

UserInfo userInfo= iUserInfoService.selectByOpenId(openid);

System.out.println("1:"+userInfo);

if (userInfo==null)

{

return ResultUtil.error(99,ResultEnum.OPENID_IS_NOT_EXISTS.getMsg());

}

//判断角色 1是买家 2是卖家

if(userInfo.getRole()!=1)

{

return ResultUtil.error(100,ResultEnum.ROLE_ERROR.getMsg());

}

//设置cookie (name value 过期时间单位是s)

CookieUtil.set(response,"openid",openid,7200);

log.info("设置cookie成功");

return ResultUtil.success();

}

/**

* 卖家登陆

* @param openid

* @param response

* @return

*/

@GetMapping("/seller")

public Result LoginBySeller(@RequestParam("openid") String openid,HttpServletRequest request, HttpServletResponse response)

{

log.info("seller openid"+openid);

//生成UUID

String token = UUID.randomUUID().toString();

//判断是否登陆 cookie不为null redis不为null

Cookie cookie= CookieUtil.get(request,"token_UUID");

if (cookie!=null && !StringUtils.isEmpty(stringRedisTemplate.opsForValue().get(String.format("token_UUID",cookie.getValue()))))

{

//这样就会防止不停的往redis里面set数据

ResultUtil.success();

}

//1.openid和数据库的匹配

UserInfo userInfo= iUserInfoService.selectByOpenId(openid);

System.out.println("2:"+userInfo);

if (userInfo==null)

{

return ResultUtil.error(99,ResultEnum.OPENID_IS_NOT_EXISTS.getMsg());

}

//2判断角色 1是买家 2是卖家

if(userInfo.getRole()!=2)

{

return ResultUtil.error(100,ResultEnum.ROLE_ERROR.getMsg());

}

//设置redis key =uuid value =xzy expire 过期时间

stringRedisTemplate.opsForValue().set(String.format("token_UUID",token),openid,7200, TimeUnit.SECONDS);

log.info("设置redis成功");

//设置cookie (token=UUID 过期时间单位是s)

CookieUtil.set(response,"token_UUID",token,7200);

log.info("设置cookie成功");

return ResultUtil.success();

}

}

5.cookie util 获取和设置cookie

package com.zhu.user.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;

}

}

6.服务网关 鉴权

package com.zhu.apigateway.filter;

import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

import com.netflix.zuul.exception.ZuulException;

import com.zhu.apigateway.util.CookieUtil;

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 javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

/**

* 权限拦截 区分买家和卖家

*/

@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() throws ZuulException {

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;

}

}

7.如果cookie为null 则权限不足 --买家

如果cookie为null 并且 redis为空 权限不足 --卖家

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值