ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
@@ -110,9 +110,4 @@ */ @PostMapping("/user/resetPassword") R resetPassword(@RequestBody SysUser user); @PostMapping("/user/getSysUserById") SysUser getSysUserById(Long userId); } ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java
@@ -24,4 +24,5 @@ " | | \\ / \\ / \n" + " ''-' `'-' `-..-' "); } } ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -1,17 +1,13 @@ 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; @@ -27,7 +23,6 @@ import io.jsonwebtoken.Claims; import reactor.core.publisher.Mono; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; @@ -48,14 +43,6 @@ @Autowired private RedisService redisService; @Lazy @Resource private AppUserClient appUserClient; @Lazy @Resource private SysUserClient sysUserClient; @Override @@ -69,20 +56,19 @@ 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); @@ -140,9 +126,19 @@ * 防抖处理 */ 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){ @@ -183,47 +179,15 @@ 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("账户已被冻结,请联系系统管理员!"); } } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/RuoYiAccountApplication.java
@@ -6,6 +6,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -19,6 +20,7 @@ @EnableRyFeignClients @SpringBootApplication @EnableScheduling//开启定时任务 @ServletComponentScan @EnableTransactionManagement//开启事务 public class RuoYiAccountApplication { public static void main(String[] args) { ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java
New file @@ -0,0 +1,117 @@ package com.ruoyi.account.filter; import com.alibaba.fastjson.JSON; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.constant.TokenConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.jsonwebtoken.Claims; import org.apache.logging.log4j.core.config.Order; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * @author zhibing.pu * @Date 2024/8/23 11:22 */ @Order(-200) @Component public class AuthFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(AuthFilter.class); @Lazy @Resource private AppUserClient appUserClient; @Lazy @Resource private SysUserClient sysUserClient; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; 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())){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"无效的账户"); return; } if("1".equals(sysUser.getStatus())){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"账户已被停用,请联系系统管理员!"); return; } } //小程序用户 if ("applet".equals(userType)) { TAppUser appUser = appUserClient.getUserById(Long.valueOf(userid)).getData(); if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"无效的账户"); return; } if(2 == appUser.getStatus()){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"账户已被冻结,请联系系统管理员!"); return; } } filterChain.doFilter(request, response); } private void unauthorizedResponse(HttpServletResponse response, String msg) { response.setStatus(HttpStatus.OK.value()); response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE); PrintWriter writer = null; try { writer = response.getWriter(); } catch (IOException e) { throw new RuntimeException(e); } writer.println(JSON.toJSONString(R.fail(msg))); writer.flush(); writer.close(); } /** * 获取请求token */ private String getToken(HttpServletRequest request) { String token = request.getHeader(TokenConstants.AUTHENTICATION); // 如果前端设置了令牌前缀,则裁剪掉前缀 if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) { token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY); } return token; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java
@@ -6,6 +6,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -19,6 +20,7 @@ @EnableRyFeignClients @SpringBootApplication @EnableScheduling//开启定时任务 @ServletComponentScan @EnableTransactionManagement//开启事务 public class RuoYiOrderApplication { public static void main(String[] args) { ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java
New file @@ -0,0 +1,117 @@ package com.ruoyi.order.filter; import com.alibaba.fastjson.JSON; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.constant.TokenConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.jsonwebtoken.Claims; import org.apache.logging.log4j.core.config.Order; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * @author zhibing.pu * @Date 2024/8/23 11:22 */ @Order(-200) @Component public class AuthFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(AuthFilter.class); @Lazy @Resource private AppUserClient appUserClient; @Lazy @Resource private SysUserClient sysUserClient; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; 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())){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"无效的账户"); return; } if("1".equals(sysUser.getStatus())){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"账户已被停用,请联系系统管理员!"); return; } } //小程序用户 if ("applet".equals(userType)) { TAppUser appUser = appUserClient.getUserById(Long.valueOf(userid)).getData(); if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"无效的账户"); return; } if(2 == appUser.getStatus()){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"账户已被冻结,请联系系统管理员!"); return; } } filterChain.doFilter(request, response); } private void unauthorizedResponse(HttpServletResponse response, String msg) { response.setStatus(HttpStatus.OK.value()); response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE); PrintWriter writer = null; try { writer = response.getWriter(); } catch (IOException e) { throw new RuntimeException(e); } writer.println(JSON.toJSONString(R.fail(msg))); writer.flush(); writer.close(); } /** * 获取请求token */ private String getToken(HttpServletRequest request) { String token = request.getHeader(TokenConstants.AUTHENTICATION); // 如果前端设置了令牌前缀,则裁剪掉前缀 if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) { token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY); } return token; } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java
@@ -7,6 +7,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -20,6 +21,7 @@ @EnableRyFeignClients @SpringBootApplication @EnableScheduling//开启定时任务 @ServletComponentScan @EnableTransactionManagement//开启事务 public class RuoYiOtherApplication { public static void main(String[] args) { ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java
New file @@ -0,0 +1,117 @@ package com.ruoyi.other.filter; import com.alibaba.fastjson.JSON; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.constant.TokenConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.JwtUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.jsonwebtoken.Claims; import org.apache.logging.log4j.core.config.Order; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * @author zhibing.pu * @Date 2024/8/23 11:22 */ @Order(-200) @Component public class AuthFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(AuthFilter.class); @Lazy @Resource private AppUserClient appUserClient; @Lazy @Resource private SysUserClient sysUserClient; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; 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())){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"无效的账户"); return; } if("1".equals(sysUser.getStatus())){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"账户已被停用,请联系系统管理员!"); return; } } //小程序用户 if ("applet".equals(userType)) { TAppUser appUser = appUserClient.getUserById(Long.valueOf(userid)).getData(); if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"无效的账户"); return; } if(2 == appUser.getStatus()){ log.error("[账户异常处理]请求账户id:{}", userid); unauthorizedResponse(response,"账户已被冻结,请联系系统管理员!"); return; } } filterChain.doFilter(request, response); } private void unauthorizedResponse(HttpServletResponse response, String msg) { response.setStatus(HttpStatus.OK.value()); response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE); PrintWriter writer = null; try { writer = response.getWriter(); } catch (IOException e) { throw new RuntimeException(e); } writer.println(JSON.toJSONString(R.fail(msg))); writer.flush(); writer.close(); } /** * 获取请求token */ private String getToken(HttpServletRequest request) { String token = request.getHeader(TokenConstants.AUTHENTICATION); // 如果前端设置了令牌前缀,则裁剪掉前缀 if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) { token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY); } return token; } }