| | |
| | | package com.ruoyi.gateway.filter; |
| | | |
| | | import com.ruoyi.account.api.feignClient.AppUserClient; |
| | | import com.ruoyi.account.api.model.TAppUser; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.feignClient.SysUserClient; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.cloud.gateway.filter.GatewayFilterChain; |
| | | import org.springframework.cloud.gateway.filter.GlobalFilter; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.core.Ordered; |
| | | import org.springframework.http.HttpHeaders; |
| | | import org.springframework.http.HttpMethod; |
| | | import org.springframework.http.server.reactive.ServerHttpRequest; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.web.server.ServerWebExchange; |
| | |
| | | import io.jsonwebtoken.Claims; |
| | | import reactor.core.publisher.Mono; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | |
| | | @Autowired |
| | | private RedisService redisService; |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private AppUserClient appUserClient; |
| | | |
| | | @Lazy |
| | | @Resource |
| | | private SysUserClient sysUserClient; |
| | | |
| | | |
| | | |
| | | @Override |
| | |
| | | return chain.filter(exchange); |
| | | } |
| | | //防抖校验 |
| | | // try { |
| | | // antiShake(request); |
| | | // }catch (Exception e){ |
| | | // log.error("[重复提交]请求路径:{}", exchange.getRequest().getPath()); |
| | | // return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage(), HttpStatus.SUCCESS); |
| | | // } |
| | | try { |
| | | antiShake(request); |
| | | }catch (Exception e){ |
| | | log.error("[重复提交]请求路径:{}", exchange.getRequest().getPath()); |
| | | return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage(), HttpStatus.SUCCESS); |
| | | } |
| | | |
| | | //校验账户是否有效 |
| | | // try { |
| | | // verifyToken(request); |
| | | // verifyAccount(request); |
| | | // }catch (Exception e){ |
| | | // return unauthorizedResponse(exchange, e.getMessage()); |
| | | // } |
| | | try { |
| | | verifyToken(request); |
| | | }catch (Exception e){ |
| | | return unauthorizedResponse(exchange, e.getMessage()); |
| | | } |
| | | String token = getToken(request); |
| | | Claims claims = JwtUtils.parseToken(token); |
| | | String userkey = JwtUtils.getUserKey(claims); |
| | |
| | | * 防抖处理 |
| | | */ |
| | | public void antiShake(ServerHttpRequest request) throws Exception{ |
| | | HttpMethod method = request.getMethod(); |
| | | if(HttpMethod.OPTIONS == method){ |
| | | return; |
| | | } |
| | | HttpHeaders headers = request.getHeaders(); |
| | | String client = headers.getFirst("client"); |
| | | String timestamp = headers.getFirst("timestamp"); |
| | | if(StringUtils.isEmpty(client)){ |
| | | throw new RuntimeException("参数异常"); |
| | | } |
| | | if(StringUtils.isEmpty(timestamp)){ |
| | | throw new RuntimeException("参数异常"); |
| | | } |
| | | String url = request.getURI().getPath(); |
| | | Map<String, Object> cacheMap = redisService.getCacheMap(client); |
| | | if(null == cacheMap){ |
| | |
| | | if (claims == null) { |
| | | throw new RuntimeException("令牌已过期或验证不正确!"); |
| | | } |
| | | String userkey = JwtUtils.getUserKey(claims); |
| | | boolean islogin = redisService.hasKey(getTokenKey(userkey)); |
| | | if (!islogin) { |
| | | throw new RuntimeException("登录状态已过期"); |
| | | } |
| | | // String userkey = JwtUtils.getUserKey(claims); |
| | | // boolean islogin = redisService.hasKey(getTokenKey(userkey)); |
| | | // if (!islogin) { |
| | | // throw new RuntimeException("登录状态已过期"); |
| | | // } |
| | | String userid = JwtUtils.getUserId(claims); |
| | | String username = JwtUtils.getUserName(claims); |
| | | if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) { |
| | | throw new RuntimeException("令牌验证失败"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 校验账户是否有效 |
| | | * @param request |
| | | * @throws Exception |
| | | */ |
| | | public void verifyAccount(ServerHttpRequest request) throws Exception{ |
| | | String token = getToken(request); |
| | | Claims claims = JwtUtils.parseToken(token); |
| | | String userid = JwtUtils.getUserId(claims); |
| | | String userType = JwtUtils.getUserType(claims); |
| | | //管理后台用户 |
| | | if ("system".equals(userType)) { |
| | | SysUser sysUser = sysUserClient.getSysUser(Long.valueOf(userid)).getData(); |
| | | if(null == sysUser || "2".equals(sysUser.getDelFlag())){ |
| | | throw new RuntimeException("无效的账户"); |
| | | } |
| | | if("1".equals(sysUser.getStatus())){ |
| | | throw new RuntimeException("账户已被停用,请联系系统管理员!"); |
| | | } |
| | | } |
| | | //小程序用户 |
| | | if ("applet".equals(userType)) { |
| | | TAppUser appUser = appUserClient.getUserById(Long.valueOf(userid)).getData(); |
| | | if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){ |
| | | throw new RuntimeException("无效的账户"); |
| | | } |
| | | if(2 == appUser.getStatus()){ |
| | | throw new RuntimeException("账户已被冻结,请联系系统管理员!"); |
| | | } |
| | | } |
| | | } |
| | | |