From afbcb67d0de8d0f4a8b2cbe49fd1efc3f18b180e Mon Sep 17 00:00:00 2001 From: DongZeLiang <2746733890@qq.com> Date: Fri, 24 May 2024 16:49:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BD=91=E5=85=B3=E9=89=B4?= =?UTF-8?q?=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud/auth/controller/AuthController.java | 21 +++-- .../muyu/cloud/auth/service/AuthService.java | 13 +++ .../auth/service/impl/AuthServiceImpl.java | 22 +++++ .../common/redis/service/RedisService.java | 2 +- .../com/muyu/CloudGatewayApplication.java | 2 + .../main/java/com/muyu/filter/AuthFilter.java | 84 +++++++++++++++++++ .../cloud/system/CloudSystemApplication.java | 2 + 7 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 cloud-gateway/src/main/java/com/muyu/filter/AuthFilter.java diff --git a/cloud-auth/src/main/java/com/muyu/cloud/auth/controller/AuthController.java b/cloud-auth/src/main/java/com/muyu/cloud/auth/controller/AuthController.java index cba76ff..c1fbffe 100644 --- a/cloud-auth/src/main/java/com/muyu/cloud/auth/controller/AuthController.java +++ b/cloud-auth/src/main/java/com/muyu/cloud/auth/controller/AuthController.java @@ -4,13 +4,12 @@ import com.muyu.cloud.auth.domain.request.UserLoginReq; import com.muyu.cloud.auth.domain.response.TokenRes; import com.muyu.cloud.auth.service.AuthService; import com.muyu.cloud.system.domain.UserInfo; +import com.muyu.common.constant.JwtConstants; +import com.muyu.common.constant.TokenConstants; import com.muyu.common.result.Result; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * @Author: DongZeLiang @@ -31,13 +30,25 @@ public class AuthController { * 登录 */ @PostMapping("/login") - public Result login(@RequestBody @Validated UserLoginReq userLoginReq) { + public Result login(@RequestBody @Validated UserLoginReq userLoginReq) { UserInfo userLoginInfo = authService.login(userLoginReq.getUserName(), userLoginReq.getPassword()); TokenRes tokenRes = authService.genToken(userLoginInfo); return Result.success(tokenRes); } + @GetMapping("/login/info") + public Result getUserInfo(@RequestHeader(JwtConstants.USER_KEY) String userKey) { + return Result.success( + authService.loginInfo(userKey) + ); + } + /** * 注销 */ + @GetMapping("/login-out") + public Result loginOut(@RequestHeader(JwtConstants.USER_KEY) String userKey){ + authService.loginOut(userKey); + return Result.success(); + } } diff --git a/cloud-auth/src/main/java/com/muyu/cloud/auth/service/AuthService.java b/cloud-auth/src/main/java/com/muyu/cloud/auth/service/AuthService.java index ea8c9a7..0fa85f1 100644 --- a/cloud-auth/src/main/java/com/muyu/cloud/auth/service/AuthService.java +++ b/cloud-auth/src/main/java/com/muyu/cloud/auth/service/AuthService.java @@ -24,4 +24,17 @@ public interface AuthService { * @return token */ TokenRes genToken (UserInfo userLoginInfo); + + /** + * 根据token获取用户相信信息 + * @param userKey 令牌 + * @return 用户信息 + */ + UserInfo loginInfo (String userKey); + + /** + * 退出登录 + * @param userKey 令牌 + */ + void loginOut (String userKey); } diff --git a/cloud-auth/src/main/java/com/muyu/cloud/auth/service/impl/AuthServiceImpl.java b/cloud-auth/src/main/java/com/muyu/cloud/auth/service/impl/AuthServiceImpl.java index 1a2d41b..2fc7f9d 100644 --- a/cloud-auth/src/main/java/com/muyu/cloud/auth/service/impl/AuthServiceImpl.java +++ b/cloud-auth/src/main/java/com/muyu/cloud/auth/service/impl/AuthServiceImpl.java @@ -96,4 +96,26 @@ public class AuthServiceImpl implements AuthService { .expiresIn(TokenConstants.EXPIRATION) .build(); } + + /** + * 根据token获取用户相信信息 + * + * @param userKey token + * + * @return 用户信息 + */ + @Override + public UserInfo loginInfo (String userKey) { + return redisService.getCacheObject(TokenConstants.LOGIN_TOKEN_KEY + userKey); + } + + /** + * 退出登录 + * + * @param userKey 令牌 + */ + @Override + public void loginOut (String userKey) { + redisService.deleteObject(TokenConstants.LOGIN_TOKEN_KEY + userKey); + } } diff --git a/cloud-common/src/main/java/com/muyu/common/redis/service/RedisService.java b/cloud-common/src/main/java/com/muyu/common/redis/service/RedisService.java index c915f61..9b17fa7 100644 --- a/cloud-common/src/main/java/com/muyu/common/redis/service/RedisService.java +++ b/cloud-common/src/main/java/com/muyu/common/redis/service/RedisService.java @@ -22,7 +22,7 @@ import java.util.concurrent.TimeUnit; @Component public class RedisService { - @Scheduled(cron = "0/5 * * * * *") + @Scheduled(cron = "0/5 * * * * ?") public void scheduled() { this.setCacheObject("skip", System.currentTimeMillis()); log.info("Redis心跳成功"); diff --git a/cloud-gateway/src/main/java/com/muyu/CloudGatewayApplication.java b/cloud-gateway/src/main/java/com/muyu/CloudGatewayApplication.java index 1870f08..cead72a 100644 --- a/cloud-gateway/src/main/java/com/muyu/CloudGatewayApplication.java +++ b/cloud-gateway/src/main/java/com/muyu/CloudGatewayApplication.java @@ -4,6 +4,7 @@ import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.scheduling.annotation.EnableScheduling; /** * @Author: DongZeLiang @@ -12,6 +13,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; * @Version: 1.0 */ @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class}) +@EnableScheduling public class CloudGatewayApplication { public static void main (String[] args) { diff --git a/cloud-gateway/src/main/java/com/muyu/filter/AuthFilter.java b/cloud-gateway/src/main/java/com/muyu/filter/AuthFilter.java new file mode 100644 index 0000000..98a3e15 --- /dev/null +++ b/cloud-gateway/src/main/java/com/muyu/filter/AuthFilter.java @@ -0,0 +1,84 @@ +package com.muyu.filter; + +import com.muyu.common.constant.JwtConstants; +import com.muyu.common.constant.TokenConstants; +import com.muyu.common.redis.service.RedisService; +import com.muyu.common.utils.JwtUtils; +import com.muyu.common.utils.StringUtils; +import com.muyu.config.IgnoreWhiteConfig; +import com.muyu.utils.GatewayUtils; +import io.jsonwebtoken.Claims; +import lombok.AllArgsConstructor; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.http.HttpHeaders; +import org.springframework.http.server.RequestPath; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.net.URI; + +/** + * @Author: DongZeLiang + * @date: 2024/5/24 + * @Description: 权限过滤器 + * @Version: 1.0 + */ +@Component +@AllArgsConstructor +public class AuthFilter implements GlobalFilter, Ordered { + + private final IgnoreWhiteConfig ignoreWhiteConfig; + + private final RedisService redisService; + + @Override + public Mono filter (ServerWebExchange exchange, GatewayFilterChain chain) { + + ServerHttpRequest request = exchange.getRequest(); + URI uri = request.getURI(); + String path = uri.getPath(); + if (StringUtils.matches(path, ignoreWhiteConfig.getWhites())){ + return chain.filter(exchange); + } + HttpHeaders requestHeaders = request.getHeaders(); + String token = requestHeaders.getFirst(TokenConstants.TOKEN); + if (StringUtils.isEmpty(token)){ + return GatewayUtils.errorResponse(exchange, "token不合法"); + } + Claims claims = JwtUtils.parseToken(token); + if (claims == null){ + return GatewayUtils.errorResponse(exchange, "token不合法"); + } + String userKey = JwtUtils.getUserKey(claims); + if (!redisService.hasKey(TokenConstants.LOGIN_TOKEN_KEY + userKey)){ + return GatewayUtils.errorResponse(exchange, "token已过期"); + } + ServerHttpRequest.Builder mutate = request.mutate(); + GatewayUtils.addHeader(mutate, JwtConstants.USER_KEY, userKey); + GatewayUtils.addHeader(mutate, JwtConstants.DETAILS_USER_ID, JwtUtils.getUserId(claims)); + GatewayUtils.addHeader(mutate, JwtConstants.DETAILS_USERNAME, JwtUtils.getUserName(claims)); + return chain.filter(exchange); + } + + /** + * Get the order value of this object. + *

Higher values are interpreted as lower priority. As a consequence, + * the object with the lowest value has the highest priority (somewhat + * analogous to Servlet {@code load-on-startup} values). + *

Same order values will result in arbitrary sort positions for the + * affected objects. + * + * @return the order value + * + * @see #HIGHEST_PRECEDENCE + * @see #LOWEST_PRECEDENCE + */ + @Override + public int getOrder () { + return 0; + } +} diff --git a/modules/cloud-system/system-server/src/main/java/com/muyu/cloud/system/CloudSystemApplication.java b/modules/cloud-system/system-server/src/main/java/com/muyu/cloud/system/CloudSystemApplication.java index f6604d5..9efa174 100644 --- a/modules/cloud-system/system-server/src/main/java/com/muyu/cloud/system/CloudSystemApplication.java +++ b/modules/cloud-system/system-server/src/main/java/com/muyu/cloud/system/CloudSystemApplication.java @@ -3,6 +3,7 @@ package com.muyu.cloud.system; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.scheduling.annotation.EnableScheduling; /** * @Author: DongZeLiang @@ -12,6 +13,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; */ @SpringBootApplication @EnableFeignClients( basePackages = {"com.muyu.**"}) +@EnableScheduling public class CloudSystemApplication { public static void main(String[] args) {