diff --git a/README.md b/README.md index f72dbcff..db95f5d8 100644 --- a/README.md +++ b/README.md @@ -45,17 +45,22 @@ youlai-boot ├── mysql5 # MySQL5 脚本 ├── mysql8 # MySQL8 脚本 ├── src # 源码目录 - ├── base # 核心模块 - ├── mybatisplus # Mybatis-Plus 配置和插件 - ├── security # Spring Security 安全配置和扩展 ├── common # 公共模块 ├── config # 自动装配配置 ├── CorsConfig # 跨域共享配置 - ├── RedisConfig # Redis 配置 + ├── MybatisConfig # Mybatis 自动装配配置 + ├── RedisCacheConfig # Redis 缓存自动装配配置 + ├── RedisConfig # Redis 自动装配配置 + ├── SecurityConfig # Spring Security 自动装配配置 ├── SwaggerConfig # API 接口文档配置 ├── WebMvcConfig # WebMvc 配置 + ├── WebSocketConfig # WebSocket 自动装配配置 + ├── XxlJobConfig # XXL-JOB 自动装配配置 ├── controller # 控制层 ├── converter # MapStruct转换器 + ├── core # 核心模块 + ├── security # Spring Security 安全配置和扩展 + ├── mybatis # Mybatis-Plus 配置和插件 ├── filter # 过滤器 ├── RequestLogFilter # 请求日志过滤器 ├── VerifyCodeFilter # 验证码过滤器 @@ -68,6 +73,7 @@ youlai-boot ├── vo # 视图对象 ├── mapper # 数据库访问层 ├── plugin # 插件(可选) + ├── captcha # 验证码插件,用于生成验证码 ├── dupsubmit # 防重提交插件,用于防止表单重复提交 ├── easyexcel # EasyExcel 插件,Excel 文件的读写 ├── rabbitmq # RabbitMQ 插件,消息队列交互 diff --git a/pom.xml b/pom.xml index 5f41cbf9..97cdaefb 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.youlai youlai-boot - 2.5.0 + 2.5.1 基于 Java 17 + SpringBoot 3 构建的权限管理系统。 diff --git a/src/main/java/com/youlai/system/common/util/SecurityUtils.java b/src/main/java/com/youlai/system/common/util/SecurityUtils.java index 9a64a377..48a7631f 100644 --- a/src/main/java/com/youlai/system/common/util/SecurityUtils.java +++ b/src/main/java/com/youlai/system/common/util/SecurityUtils.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.youlai.system.common.constant.SystemConstants; -import com.youlai.system.base.security.model.SysUserDetails; +import com.youlai.system.core.security.model.SysUserDetails; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; diff --git a/src/main/java/com/youlai/system/base/mybatisplus/config/MybatisPlusConfig.java b/src/main/java/com/youlai/system/config/MybatisConfig.java similarity index 86% rename from src/main/java/com/youlai/system/base/mybatisplus/config/MybatisPlusConfig.java rename to src/main/java/com/youlai/system/config/MybatisConfig.java index 018d9ef0..74274c85 100644 --- a/src/main/java/com/youlai/system/base/mybatisplus/config/MybatisPlusConfig.java +++ b/src/main/java/com/youlai/system/config/MybatisConfig.java @@ -1,12 +1,12 @@ -package com.youlai.system.base.mybatisplus.config; +package com.youlai.system.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.youlai.system.base.mybatisplus.handler.MyDataPermissionHandler; -import com.youlai.system.base.mybatisplus.handler.MyMetaObjectHandler; +import com.youlai.system.core.mybatis.handler.MyDataPermissionHandler; +import com.youlai.system.core.mybatis.handler.MyMetaObjectHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -19,7 +19,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; */ @Configuration @EnableTransactionManagement -public class MybatisPlusConfig { +public class MybatisConfig { /** * 分页插件和数据权限插件 diff --git a/src/main/java/com/youlai/system/base/security/config/SecurityConfig.java b/src/main/java/com/youlai/system/config/SecurityConfig.java similarity index 93% rename from src/main/java/com/youlai/system/base/security/config/SecurityConfig.java rename to src/main/java/com/youlai/system/config/SecurityConfig.java index f970e35c..01896f04 100644 --- a/src/main/java/com/youlai/system/base/security/config/SecurityConfig.java +++ b/src/main/java/com/youlai/system/config/SecurityConfig.java @@ -1,11 +1,11 @@ -package com.youlai.system.base.security.config; +package com.youlai.system.config; import com.youlai.system.common.constant.SecurityConstants; -import com.youlai.system.base.security.exception.MyAccessDeniedHandler; -import com.youlai.system.base.security.exception.MyAuthenticationEntryPoint; -import com.youlai.system.base.security.jwt.JwtTokenFilter; +import com.youlai.system.core.security.exception.MyAccessDeniedHandler; +import com.youlai.system.core.security.exception.MyAuthenticationEntryPoint; +import com.youlai.system.core.security.jwt.JwtTokenFilter; import com.youlai.system.filter.VerifyCodeFilter; -import com.youlai.system.base.security.jwt.JwtTokenProvider; +import com.youlai.system.core.security.jwt.JwtTokenProvider; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/youlai/system/config/WebSocketConfig.java b/src/main/java/com/youlai/system/config/WebSocketConfig.java new file mode 100644 index 00000000..c44e0fe3 --- /dev/null +++ b/src/main/java/com/youlai/system/config/WebSocketConfig.java @@ -0,0 +1,111 @@ +package com.youlai.system.config; + +import cn.hutool.core.util.StrUtil; +import com.youlai.system.core.security.jwt.JwtTokenProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpHeaders; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.simp.config.ChannelRegistration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.messaging.simp.stomp.StompCommand; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.messaging.support.MessageHeaderAccessor; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +/** + * WebSocket 配置 + * + * @author haoxr + * @since 2.4.0 + */ +@Configuration +@EnableWebSocketMessageBroker // 启用WebSocket消息代理功能和配置STOMP协议,实现实时双向通信和消息传递 +@RequiredArgsConstructor +@Slf4j +public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + + private final JwtTokenProvider jwtTokenProvider; + + /** + * 注册一个端点,客户端通过这个端点进行连接 + */ + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry + .addEndpoint("/ws") // 注册了一个 /ws 的端点 + .setAllowedOriginPatterns("*") // 允许跨域的 WebSocket 连接 + .withSockJS(); // 启用 SockJS (浏览器不支持WebSocket,SockJS 将会提供兼容性支持) + registry.addEndpoint("/ws-app").setAllowedOriginPatterns("*"); // 注册了一个 /ws-app 的端点,支持 uni-app 的 ws 连接协议 + } + + + /** + * 配置消息代理 + */ + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // 客户端发送消息的请求前缀 + registry.setApplicationDestinationPrefixes("/app"); + + // 客户端订阅消息的请求前缀,topic一般用于广播推送,queue用于点对点推送 + registry.enableSimpleBroker("/topic", "/queue"); + + // 服务端通知客户端的前缀,可以不设置,默认为user + registry.setUserDestinationPrefix("/user"); + } + + + /** + * 配置客户端入站通道拦截器 + * + * @param registration 通道注册器 + */ + @Override + public void configureClientInboundChannel(ChannelRegistration registration) { + registration.interceptors(new ChannelInterceptor() { + @Override + public Message preSend(Message message, MessageChannel channel) { + StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); + + // 如果 StompHeaderAccessor 为 null,说明不是 STOMP 消息,直接放行 + if (accessor == null) { + return ChannelInterceptor.super.preSend(message, channel); + } + + // 如果是连接请求(CONNECT 命令),从请求头中取出 token 并设置到认证信息中 + if (StompCommand.CONNECT.equals(accessor.getCommand())) { + // 从连接头中提取授权令牌 + String bearerToken = accessor.getFirstNativeHeader(HttpHeaders.AUTHORIZATION); + + // 验证令牌格式并提取用户信息 + if (StrUtil.isNotBlank(bearerToken) && bearerToken.startsWith("Bearer ")) { + try { + // 移除 "Bearer " 前缀 + String tokenWithoutPrefix = bearerToken.substring(7); + String username = jwtTokenProvider.getUsername(tokenWithoutPrefix); + + // 如果用户名有效,设置用户到访问器中 + if (StrUtil.isNotBlank(username)) { + accessor.setUser(() -> username); + return message; + } + } catch (Exception e) { + // 异常处理,可能是解析令牌失败 + log.error("Failed to process authentication token.", e); + } + } + } + + // 如果不是连接命令或授权失败,继续执行默认逻辑 + return ChannelInterceptor.super.preSend(message, channel); + } + }); + } + +} diff --git a/src/main/java/com/youlai/system/plugin/xxljob/XxlJobConfig.java b/src/main/java/com/youlai/system/config/XxlJobConfig.java similarity index 97% rename from src/main/java/com/youlai/system/plugin/xxljob/XxlJobConfig.java rename to src/main/java/com/youlai/system/config/XxlJobConfig.java index d326dd6e..a0f802ed 100644 --- a/src/main/java/com/youlai/system/plugin/xxljob/XxlJobConfig.java +++ b/src/main/java/com/youlai/system/config/XxlJobConfig.java @@ -1,4 +1,4 @@ -package com.youlai.system.plugin.xxljob; +package com.youlai.system.config; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/youlai/system/controller/WebsocketController.java b/src/main/java/com/youlai/system/controller/WebsocketController.java index 18d724cb..ed82a66e 100644 --- a/src/main/java/com/youlai/system/controller/WebsocketController.java +++ b/src/main/java/com/youlai/system/controller/WebsocketController.java @@ -1,6 +1,6 @@ package com.youlai.system.controller; -import com.youlai.system.model.dto.SocketMessage; +import com.youlai.system.model.dto.ChatMessage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.handler.annotation.DestinationVariable; @@ -48,11 +48,14 @@ public class WebsocketController { * @param message 消息内容 */ @MessageMapping("/sendToUser/{username}") - //@SendToUser(value = "/queue/greeting") public void sendToUser(Principal principal, @DestinationVariable String username, String message) { - log.info("sender:{};receiver:{}", principal.getName(), username); - messagingTemplate.convertAndSendToUser(username, "/queue/greeting", new SocketMessage(principal.getName(), message)); - /// return "Hello, " + message; + + String sender = principal.getName(); // 发送人 + String receiver = username; // 接收人 + + log.info("发送人:{}; 接收人:{}", sender, receiver); + // 发送消息给指定用户 /user/{username}/queue/greeting + messagingTemplate.convertAndSendToUser(receiver, "/queue/greeting", new ChatMessage(sender, message)); } } diff --git a/src/main/java/com/youlai/system/base/mybatisplus/annotation/DataPermission.java b/src/main/java/com/youlai/system/core/mybatis/annotation/DataPermission.java similarity index 90% rename from src/main/java/com/youlai/system/base/mybatisplus/annotation/DataPermission.java rename to src/main/java/com/youlai/system/core/mybatis/annotation/DataPermission.java index edd372a9..63e73277 100644 --- a/src/main/java/com/youlai/system/base/mybatisplus/annotation/DataPermission.java +++ b/src/main/java/com/youlai/system/core/mybatis/annotation/DataPermission.java @@ -1,4 +1,4 @@ -package com.youlai.system.base.mybatisplus.annotation; +package com.youlai.system.core.mybatis.annotation; import java.lang.annotation.*; diff --git a/src/main/java/com/youlai/system/base/mybatisplus/handler/MyDataPermissionHandler.java b/src/main/java/com/youlai/system/core/mybatis/handler/MyDataPermissionHandler.java similarity index 96% rename from src/main/java/com/youlai/system/base/mybatisplus/handler/MyDataPermissionHandler.java rename to src/main/java/com/youlai/system/core/mybatis/handler/MyDataPermissionHandler.java index 82a275a8..b39f9b10 100644 --- a/src/main/java/com/youlai/system/base/mybatisplus/handler/MyDataPermissionHandler.java +++ b/src/main/java/com/youlai/system/core/mybatis/handler/MyDataPermissionHandler.java @@ -1,9 +1,9 @@ -package com.youlai.system.base.mybatisplus.handler; +package com.youlai.system.core.mybatis.handler; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler; -import com.youlai.system.base.mybatisplus.annotation.DataPermission; +import com.youlai.system.core.mybatis.annotation.DataPermission; import com.youlai.system.common.base.IBaseEnum; import com.youlai.system.common.enums.DataScopeEnum; import com.youlai.system.common.util.SecurityUtils; diff --git a/src/main/java/com/youlai/system/base/mybatisplus/handler/MyMetaObjectHandler.java b/src/main/java/com/youlai/system/core/mybatis/handler/MyMetaObjectHandler.java similarity index 94% rename from src/main/java/com/youlai/system/base/mybatisplus/handler/MyMetaObjectHandler.java rename to src/main/java/com/youlai/system/core/mybatis/handler/MyMetaObjectHandler.java index 68bcfc40..9cf7d3d5 100644 --- a/src/main/java/com/youlai/system/base/mybatisplus/handler/MyMetaObjectHandler.java +++ b/src/main/java/com/youlai/system/core/mybatis/handler/MyMetaObjectHandler.java @@ -1,4 +1,4 @@ -package com.youlai.system.base.mybatisplus.handler; +package com.youlai.system.core.mybatis.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; diff --git a/src/main/java/com/youlai/system/base/security/exception/MyAccessDeniedHandler.java b/src/main/java/com/youlai/system/core/security/exception/MyAccessDeniedHandler.java similarity index 94% rename from src/main/java/com/youlai/system/base/security/exception/MyAccessDeniedHandler.java rename to src/main/java/com/youlai/system/core/security/exception/MyAccessDeniedHandler.java index 60bb2623..c7979301 100644 --- a/src/main/java/com/youlai/system/base/security/exception/MyAccessDeniedHandler.java +++ b/src/main/java/com/youlai/system/core/security/exception/MyAccessDeniedHandler.java @@ -1,4 +1,4 @@ -package com.youlai.system.base.security.exception; +package com.youlai.system.core.security.exception; import com.youlai.system.common.result.ResultCode; import com.youlai.system.common.util.ResponseUtils; diff --git a/src/main/java/com/youlai/system/base/security/exception/MyAuthenticationEntryPoint.java b/src/main/java/com/youlai/system/core/security/exception/MyAuthenticationEntryPoint.java similarity index 95% rename from src/main/java/com/youlai/system/base/security/exception/MyAuthenticationEntryPoint.java rename to src/main/java/com/youlai/system/core/security/exception/MyAuthenticationEntryPoint.java index a5fd840c..2a82ab8a 100644 --- a/src/main/java/com/youlai/system/base/security/exception/MyAuthenticationEntryPoint.java +++ b/src/main/java/com/youlai/system/core/security/exception/MyAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package com.youlai.system.base.security.exception; +package com.youlai.system.core.security.exception; import com.youlai.system.common.result.ResultCode; import com.youlai.system.common.util.ResponseUtils; diff --git a/src/main/java/com/youlai/system/base/security/jwt/JwtTokenFilter.java b/src/main/java/com/youlai/system/core/security/jwt/JwtTokenFilter.java similarity index 97% rename from src/main/java/com/youlai/system/base/security/jwt/JwtTokenFilter.java rename to src/main/java/com/youlai/system/core/security/jwt/JwtTokenFilter.java index a116f1d7..5fba6042 100644 --- a/src/main/java/com/youlai/system/base/security/jwt/JwtTokenFilter.java +++ b/src/main/java/com/youlai/system/core/security/jwt/JwtTokenFilter.java @@ -1,4 +1,4 @@ -package com.youlai.system.base.security.jwt; +package com.youlai.system.core.security.jwt; import com.youlai.system.common.result.ResultCode; import com.youlai.system.common.util.ResponseUtils; diff --git a/src/main/java/com/youlai/system/base/security/jwt/JwtTokenProvider.java b/src/main/java/com/youlai/system/core/security/jwt/JwtTokenProvider.java similarity index 98% rename from src/main/java/com/youlai/system/base/security/jwt/JwtTokenProvider.java rename to src/main/java/com/youlai/system/core/security/jwt/JwtTokenProvider.java index 26725297..2f34d6c3 100644 --- a/src/main/java/com/youlai/system/base/security/jwt/JwtTokenProvider.java +++ b/src/main/java/com/youlai/system/core/security/jwt/JwtTokenProvider.java @@ -1,8 +1,8 @@ -package com.youlai.system.base.security.jwt; +package com.youlai.system.core.security.jwt; import cn.hutool.core.convert.Convert; import com.youlai.system.common.constant.JwtClaimConstants; -import com.youlai.system.base.security.model.SysUserDetails; +import com.youlai.system.core.security.model.SysUserDetails; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; diff --git a/src/main/java/com/youlai/system/base/security/model/SysUserDetails.java b/src/main/java/com/youlai/system/core/security/model/SysUserDetails.java similarity index 98% rename from src/main/java/com/youlai/system/base/security/model/SysUserDetails.java rename to src/main/java/com/youlai/system/core/security/model/SysUserDetails.java index 124c60e2..578d3a2a 100644 --- a/src/main/java/com/youlai/system/base/security/model/SysUserDetails.java +++ b/src/main/java/com/youlai/system/core/security/model/SysUserDetails.java @@ -1,4 +1,4 @@ -package com.youlai.system.base.security.model; +package com.youlai.system.core.security.model; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; diff --git a/src/main/java/com/youlai/system/base/security/service/PermissionService.java b/src/main/java/com/youlai/system/core/security/service/PermissionService.java similarity index 98% rename from src/main/java/com/youlai/system/base/security/service/PermissionService.java rename to src/main/java/com/youlai/system/core/security/service/PermissionService.java index ced6e3e8..b13b8784 100644 --- a/src/main/java/com/youlai/system/base/security/service/PermissionService.java +++ b/src/main/java/com/youlai/system/core/security/service/PermissionService.java @@ -1,4 +1,4 @@ -package com.youlai.system.base.security.service; +package com.youlai.system.core.security.service; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; diff --git a/src/main/java/com/youlai/system/base/security/service/SysUserDetailsService.java b/src/main/java/com/youlai/system/core/security/service/SysUserDetailsService.java similarity index 89% rename from src/main/java/com/youlai/system/base/security/service/SysUserDetailsService.java rename to src/main/java/com/youlai/system/core/security/service/SysUserDetailsService.java index 7d575451..f2f8b26f 100644 --- a/src/main/java/com/youlai/system/base/security/service/SysUserDetailsService.java +++ b/src/main/java/com/youlai/system/core/security/service/SysUserDetailsService.java @@ -1,6 +1,6 @@ -package com.youlai.system.base.security.service; +package com.youlai.system.core.security.service; -import com.youlai.system.base.security.model.SysUserDetails; +import com.youlai.system.core.security.model.SysUserDetails; import com.youlai.system.model.dto.UserAuthInfo; import com.youlai.system.service.SysUserService; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/youlai/system/mapper/SysDeptMapper.java b/src/main/java/com/youlai/system/mapper/SysDeptMapper.java index 73bf622d..3b4aaa97 100644 --- a/src/main/java/com/youlai/system/mapper/SysDeptMapper.java +++ b/src/main/java/com/youlai/system/mapper/SysDeptMapper.java @@ -3,7 +3,7 @@ package com.youlai.system.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.Constants; -import com.youlai.system.base.mybatisplus.annotation.DataPermission; +import com.youlai.system.core.mybatis.annotation.DataPermission; import com.youlai.system.model.entity.SysDept; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/src/main/java/com/youlai/system/mapper/SysUserMapper.java b/src/main/java/com/youlai/system/mapper/SysUserMapper.java index ebb59ca2..45ffca7e 100644 --- a/src/main/java/com/youlai/system/mapper/SysUserMapper.java +++ b/src/main/java/com/youlai/system/mapper/SysUserMapper.java @@ -2,7 +2,7 @@ package com.youlai.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.youlai.system.base.mybatisplus.annotation.DataPermission; +import com.youlai.system.core.mybatis.annotation.DataPermission; import com.youlai.system.model.bo.UserBO; import com.youlai.system.model.entity.SysUser; import com.youlai.system.model.dto.UserAuthInfo; diff --git a/src/main/java/com/youlai/system/model/dto/SocketMessage.java b/src/main/java/com/youlai/system/model/dto/ChatMessage.java similarity index 91% rename from src/main/java/com/youlai/system/model/dto/SocketMessage.java rename to src/main/java/com/youlai/system/model/dto/ChatMessage.java index cda51641..6dd6de32 100644 --- a/src/main/java/com/youlai/system/model/dto/SocketMessage.java +++ b/src/main/java/com/youlai/system/model/dto/ChatMessage.java @@ -10,7 +10,7 @@ import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor -public class SocketMessage { +public class ChatMessage { /** * 发送者 diff --git a/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java b/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java index 90a08fd6..23777e92 100644 --- a/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java +++ b/src/main/java/com/youlai/system/plugin/dupsubmit/aspect/DuplicateSubmitAspect.java @@ -4,7 +4,7 @@ import cn.hutool.core.util.StrUtil; import com.youlai.system.plugin.dupsubmit.annotation.PreventDuplicateSubmit; import com.youlai.system.common.result.ResultCode; import com.youlai.system.common.exception.BusinessException; -import com.youlai.system.base.security.jwt.JwtTokenProvider; +import com.youlai.system.core.security.jwt.JwtTokenProvider; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/youlai/system/plugin/websocket/WebSocketConfig.java b/src/main/java/com/youlai/system/plugin/websocket/WebSocketConfig.java deleted file mode 100644 index 85f865c8..00000000 --- a/src/main/java/com/youlai/system/plugin/websocket/WebSocketConfig.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.youlai.system.plugin.websocket; - -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Configuration; -import org.springframework.messaging.simp.config.ChannelRegistration; -import org.springframework.messaging.simp.config.MessageBrokerRegistry; -import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; -import org.springframework.web.socket.config.annotation.StompEndpointRegistry; -import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; - -/** - * WebSocket 配置 - * - * @author haoxr - * @since 2.4.0 - */ -@Configuration -@EnableWebSocketMessageBroker // 启用WebSocket消息代理功能和配置STOMP协议,实现实时双向通信和消息传递 -@RequiredArgsConstructor -public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { - - private final WebsocketChannelInterceptor websocketChannelInterceptor; - - /** - * 注册一个端点,客户端通过这个端点进行连接 - */ - @Override - public void registerStompEndpoints(StompEndpointRegistry registry) { - registry - .addEndpoint("/ws") // 注册了一个 /ws 的端点 - .setAllowedOriginPatterns("*") // 允许跨域的 WebSocket 连接 - .withSockJS(); // 启用 SockJS (浏览器不支持WebSocket,SockJS 将会提供兼容性支持) - registry.addEndpoint("/ws-app").setAllowedOriginPatterns("*"); // 注册了一个 /ws-app 的端点,支持 uni-app 的 ws 连接协议 - } - - - /** - * 配置消息代理 - */ - @Override - public void configureMessageBroker(MessageBrokerRegistry registry) { - // 客户端发送消息的请求前缀 - registry.setApplicationDestinationPrefixes("/app"); - - // 客户端订阅消息的请求前缀,topic一般用于广播推送,queue用于点对点推送 - registry.enableSimpleBroker("/topic", "/queue"); - - // 服务端通知客户端的前缀,可以不设置,默认为user - registry.setUserDestinationPrefix("/user"); - } - - - /** - * 配置客户端入站通道拦截器 - * - * @param registration 通道注册器 - */ - @Override - public void configureClientInboundChannel(ChannelRegistration registration) { - registration.interceptors(websocketChannelInterceptor); - } -} diff --git a/src/main/java/com/youlai/system/plugin/websocket/WebsocketChannelInterceptor.java b/src/main/java/com/youlai/system/plugin/websocket/WebsocketChannelInterceptor.java deleted file mode 100644 index bbfca0f2..00000000 --- a/src/main/java/com/youlai/system/plugin/websocket/WebsocketChannelInterceptor.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.youlai.system.plugin.websocket; - -import cn.hutool.core.util.StrUtil; -import com.youlai.system.base.security.jwt.JwtTokenProvider; -import lombok.RequiredArgsConstructor; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageChannel; -import org.springframework.messaging.simp.stomp.StompCommand; -import org.springframework.messaging.simp.stomp.StompHeaderAccessor; -import org.springframework.messaging.support.ChannelInterceptor; -import org.springframework.messaging.support.MessageHeaderAccessor; -import org.springframework.stereotype.Component; - -import java.security.Principal; - -/** - * Websocket 连接认证拦截器 - * - * @author haoxr - * @since 2.4.0 - */ -@Component -@RequiredArgsConstructor -public class WebsocketChannelInterceptor implements ChannelInterceptor { - - private final JwtTokenProvider jwtTokenProvider; - - /** - * 连接前监听 - * - * @param message 消息 - * @param channel 通道 - * @return - */ - @Override - public Message preSend(Message message, MessageChannel channel) { - StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); - assert accessor != null; - - if (StompCommand.CONNECT.equals(accessor.getCommand())) { - String bearerToken = accessor.getFirstNativeHeader("Authorization"); - if (StrUtil.isNotBlank(bearerToken)) { - bearerToken = bearerToken.substring(7); // remove "Bearer " - String username = jwtTokenProvider.getUsername(bearerToken); - if (StrUtil.isNotBlank(username)) { - Principal principal = () -> username; - accessor.setUser(principal); - return message; - } - } - } - return ChannelInterceptor.super.preSend(message, channel); - } - -} diff --git a/src/main/java/com/youlai/system/service/impl/AuthServiceImpl.java b/src/main/java/com/youlai/system/service/impl/AuthServiceImpl.java index fedac225..a34e4ed5 100644 --- a/src/main/java/com/youlai/system/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/youlai/system/service/impl/AuthServiceImpl.java @@ -1,10 +1,9 @@ package com.youlai.system.service.impl; -import cn.hutool.captcha.AbstractCaptcha; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.youlai.system.common.constant.CacheConstants; -import com.youlai.system.base.security.jwt.JwtTokenProvider; +import com.youlai.system.core.security.jwt.JwtTokenProvider; import com.youlai.system.model.dto.CaptchaResult; import com.youlai.system.model.dto.LoginResult; import com.youlai.system.plugin.captcha.CaptchaGenerator; diff --git a/src/main/java/com/youlai/system/service/impl/SysRoleServiceImpl.java b/src/main/java/com/youlai/system/service/impl/SysRoleServiceImpl.java index 7561592d..4771cbba 100644 --- a/src/main/java/com/youlai/system/service/impl/SysRoleServiceImpl.java +++ b/src/main/java/com/youlai/system/service/impl/SysRoleServiceImpl.java @@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.model.Option; import com.youlai.system.converter.RoleConverter; -import com.youlai.system.base.security.service.PermissionService; +import com.youlai.system.core.security.service.PermissionService; import com.youlai.system.mapper.SysRoleMapper; import com.youlai.system.model.entity.SysRole; import com.youlai.system.model.entity.SysRoleMenu;