From bd1a356333471ac9dea51ab4c811c582e4efddb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sat, 8 Feb 2025 19:34:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=A1=B9=E7=9B=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qyft/gd/system/common/utils/SecurityUtils.java | 2 +- .../qyft/gd/system/controller/AuthController.java | 2 +- .../qyft/gd/system/model/AuthenticationToken.java | 27 ------- .../com/qyft/gd/system/model/SysUserDetails.java | 89 ---------------------- .../com/qyft/gd/system/model/dto/UserAuthInfo.java | 3 - .../com/qyft/gd/system/model/form/RoleForm.java | 9 +-- .../com/qyft/gd/system/model/form/UserForm.java | 16 ++-- .../qyft/gd/system/security/JwtTokenManager.java | 4 +- .../gd/system/security/SysUserDetailsService.java | 5 +- .../com/qyft/gd/system/security/TokenManager.java | 2 +- .../system/security/model/AuthenticationToken.java | 27 +++++++ .../gd/system/security/model/SysUserDetails.java | 89 ++++++++++++++++++++++ .../com/qyft/gd/system/service/AuthService.java | 5 +- .../gd/system/service/impl/AuthServiceImpl.java | 2 +- src/main/resources/application.yml | 2 +- 15 files changed, 136 insertions(+), 148 deletions(-) delete mode 100644 src/main/java/com/qyft/gd/system/model/AuthenticationToken.java delete mode 100644 src/main/java/com/qyft/gd/system/model/SysUserDetails.java create mode 100644 src/main/java/com/qyft/gd/system/security/model/AuthenticationToken.java create mode 100644 src/main/java/com/qyft/gd/system/security/model/SysUserDetails.java diff --git a/src/main/java/com/qyft/gd/system/common/utils/SecurityUtils.java b/src/main/java/com/qyft/gd/system/common/utils/SecurityUtils.java index 4af361a..f4f086f 100644 --- a/src/main/java/com/qyft/gd/system/common/utils/SecurityUtils.java +++ b/src/main/java/com/qyft/gd/system/common/utils/SecurityUtils.java @@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.qyft.gd.system.common.constant.SecurityConstants; import com.qyft.gd.system.common.constant.SystemConstants; -import com.qyft.gd.system.model.SysUserDetails; +import com.qyft.gd.system.security.model.SysUserDetails; import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.HttpHeaders; import org.springframework.security.core.Authentication; diff --git a/src/main/java/com/qyft/gd/system/controller/AuthController.java b/src/main/java/com/qyft/gd/system/controller/AuthController.java index c013334..8e08761 100644 --- a/src/main/java/com/qyft/gd/system/controller/AuthController.java +++ b/src/main/java/com/qyft/gd/system/controller/AuthController.java @@ -1,7 +1,7 @@ package com.qyft.gd.system.controller; import com.qyft.gd.system.common.result.Result; -import com.qyft.gd.system.model.AuthenticationToken; +import com.qyft.gd.system.security.model.AuthenticationToken; import com.qyft.gd.system.service.AuthService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; diff --git a/src/main/java/com/qyft/gd/system/model/AuthenticationToken.java b/src/main/java/com/qyft/gd/system/model/AuthenticationToken.java deleted file mode 100644 index 20ca9a4..0000000 --- a/src/main/java/com/qyft/gd/system/model/AuthenticationToken.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.qyft.gd.system.model; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Builder; -import lombok.Data; - -/** - * 认证令牌响应对象 - */ -@Schema(description = "认证令牌响应对象") -@Data -@Builder -public class AuthenticationToken { - - @Schema(description = "令牌类型", example = "Bearer") - private String tokenType; - - @Schema(description = "访问令牌") - private String accessToken; - - @Schema(description = "刷新令牌") - private String refreshToken; - - @Schema(description = "过期时间(单位:秒)") - private Integer expiresIn; - -} diff --git a/src/main/java/com/qyft/gd/system/model/SysUserDetails.java b/src/main/java/com/qyft/gd/system/model/SysUserDetails.java deleted file mode 100644 index e0d6472..0000000 --- a/src/main/java/com/qyft/gd/system/model/SysUserDetails.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.qyft.gd.system.model; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ObjectUtil; -import com.qyft.gd.system.common.constant.SecurityConstants; -import com.qyft.gd.system.model.dto.UserAuthInfo; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -import java.util.Collection; -import java.util.Collections; -import java.util.stream.Collectors; - -/** - * Spring Security 用户认证对象 - */ -@Data -@NoArgsConstructor -public class SysUserDetails implements UserDetails { - - /** - * 用户ID - */ - private Long userId; - - /** - * 用户名 - */ - private String username; - - /** - * 密码 - */ - private String password; - - /** - * 账号是否启用(true:启用,false:禁用) - */ - private Boolean enabled; - - /** - * 用户角色权限集合 - */ - private Collection authorities; - - /** - * 构造函数:根据用户认证信息初始化用户详情对象 - * - * @param user 用户认证信息对象 {@link UserAuthInfo} - */ - public SysUserDetails(UserAuthInfo user) { - this.userId = user.getUserId(); - this.username = user.getUsername(); - this.password = user.getPassword(); - this.enabled = ObjectUtil.equal(user.getStatus(), 1); - - // 初始化角色权限集合 - this.authorities = CollectionUtil.isNotEmpty(user.getRoles()) - ? user.getRoles().stream() - // 角色名加上前缀 "ROLE_",用于区分角色 (ROLE_ADMIN) 和权限 (user:add) - .map(role -> new SimpleGrantedAuthority(SecurityConstants.ROLE_PREFIX + role)) - .collect(Collectors.toSet()) - : Collections.emptySet(); - } - - - @Override - public Collection getAuthorities() { - return this.authorities; - } - - @Override - public String getPassword() { - return this.password; - } - - @Override - public String getUsername() { - return this.username; - } - - @Override - public boolean isEnabled() { - return this.enabled; - } -} diff --git a/src/main/java/com/qyft/gd/system/model/dto/UserAuthInfo.java b/src/main/java/com/qyft/gd/system/model/dto/UserAuthInfo.java index 4615bf1..eeaf69d 100644 --- a/src/main/java/com/qyft/gd/system/model/dto/UserAuthInfo.java +++ b/src/main/java/com/qyft/gd/system/model/dto/UserAuthInfo.java @@ -6,9 +6,6 @@ import java.util.Set; /** * 用户认证信息 - * - * @author Ray.Hao - * @since 2022/10/22 */ @Data public class UserAuthInfo { diff --git a/src/main/java/com/qyft/gd/system/model/form/RoleForm.java b/src/main/java/com/qyft/gd/system/model/form/RoleForm.java index 2169715..5bcf44f 100644 --- a/src/main/java/com/qyft/gd/system/model/form/RoleForm.java +++ b/src/main/java/com/qyft/gd/system/model/form/RoleForm.java @@ -1,23 +1,22 @@ package com.qyft.gd.system.model.form; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; import lombok.Data; @Schema(description = "角色表单对象") @Data public class RoleForm { - @Schema(description="角色ID") + @Schema(description = "角色ID") private Long id; - @Schema(description="角色名称") + @Schema(description = "角色名称") private String name; - @Schema(description="角色编码") + @Schema(description = "角色编码") private String code; - @Schema(description="角色状态(1-正常;0-停用)") + @Schema(description = "角色状态(1-正常;0-停用)") private Integer status; } diff --git a/src/main/java/com/qyft/gd/system/model/form/UserForm.java b/src/main/java/com/qyft/gd/system/model/form/UserForm.java index 85bcb1d..fb287bb 100644 --- a/src/main/java/com/qyft/gd/system/model/form/UserForm.java +++ b/src/main/java/com/qyft/gd/system/model/form/UserForm.java @@ -1,8 +1,6 @@ package com.qyft.gd.system.model.form; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; import lombok.Data; import java.util.List; @@ -14,25 +12,25 @@ import java.util.List; @Data public class UserForm { - @Schema(description="用户ID") + @Schema(description = "用户ID") private Long id; - @Schema(description="用户名") + @Schema(description = "用户名") private String username; - @Schema(description="昵称") + @Schema(description = "昵称") private String nickname; - @Schema(description="性别") + @Schema(description = "性别") private Integer gender; - @Schema(description="用户头像") + @Schema(description = "用户头像") private String avatar; - @Schema(description="用户状态(1:正常;0:禁用)") + @Schema(description = "用户状态(1:正常;0:禁用)") private Integer status; - @Schema(description="角色ID集合") + @Schema(description = "角色ID集合") private List roleIds; } diff --git a/src/main/java/com/qyft/gd/system/security/JwtTokenManager.java b/src/main/java/com/qyft/gd/system/security/JwtTokenManager.java index 35b1591..ec31b17 100644 --- a/src/main/java/com/qyft/gd/system/security/JwtTokenManager.java +++ b/src/main/java/com/qyft/gd/system/security/JwtTokenManager.java @@ -11,8 +11,8 @@ import com.qyft.gd.system.common.constant.JwtClaimConstants; import com.qyft.gd.system.common.exception.BusinessException; import com.qyft.gd.system.common.result.ResultCode; import com.qyft.gd.system.config.SecurityProperties; -import com.qyft.gd.system.model.AuthenticationToken; -import com.qyft.gd.system.model.SysUserDetails; +import com.qyft.gd.system.security.model.AuthenticationToken; +import com.qyft.gd.system.security.model.SysUserDetails; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; diff --git a/src/main/java/com/qyft/gd/system/security/SysUserDetailsService.java b/src/main/java/com/qyft/gd/system/security/SysUserDetailsService.java index c3686a4..197166b 100644 --- a/src/main/java/com/qyft/gd/system/security/SysUserDetailsService.java +++ b/src/main/java/com/qyft/gd/system/security/SysUserDetailsService.java @@ -1,6 +1,6 @@ package com.qyft.gd.system.security; -import com.qyft.gd.system.model.SysUserDetails; +import com.qyft.gd.system.security.model.SysUserDetails; import com.qyft.gd.system.model.dto.UserAuthInfo; import com.qyft.gd.system.service.UserService; import lombok.RequiredArgsConstructor; @@ -12,9 +12,6 @@ import org.springframework.stereotype.Service; /** * 系统用户认证 DetailsService - * - * @author Ray.Hao - * @since 2021/10/19 */ @Service @RequiredArgsConstructor diff --git a/src/main/java/com/qyft/gd/system/security/TokenManager.java b/src/main/java/com/qyft/gd/system/security/TokenManager.java index 54fefca..07e9c77 100644 --- a/src/main/java/com/qyft/gd/system/security/TokenManager.java +++ b/src/main/java/com/qyft/gd/system/security/TokenManager.java @@ -1,7 +1,7 @@ package com.qyft.gd.system.security; -import com.qyft.gd.system.model.AuthenticationToken; +import com.qyft.gd.system.security.model.AuthenticationToken; import org.springframework.security.core.Authentication; /** diff --git a/src/main/java/com/qyft/gd/system/security/model/AuthenticationToken.java b/src/main/java/com/qyft/gd/system/security/model/AuthenticationToken.java new file mode 100644 index 0000000..5959f12 --- /dev/null +++ b/src/main/java/com/qyft/gd/system/security/model/AuthenticationToken.java @@ -0,0 +1,27 @@ +package com.qyft.gd.system.security.model; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +/** + * 认证令牌响应对象 + */ +@Schema(description = "认证令牌响应对象") +@Data +@Builder +public class AuthenticationToken { + + @Schema(description = "令牌类型", example = "Bearer") + private String tokenType; + + @Schema(description = "访问令牌") + private String accessToken; + + @Schema(description = "刷新令牌") + private String refreshToken; + + @Schema(description = "过期时间(单位:秒)") + private Integer expiresIn; + +} diff --git a/src/main/java/com/qyft/gd/system/security/model/SysUserDetails.java b/src/main/java/com/qyft/gd/system/security/model/SysUserDetails.java new file mode 100644 index 0000000..f6c9391 --- /dev/null +++ b/src/main/java/com/qyft/gd/system/security/model/SysUserDetails.java @@ -0,0 +1,89 @@ +package com.qyft.gd.system.security.model; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import com.qyft.gd.system.common.constant.SecurityConstants; +import com.qyft.gd.system.model.dto.UserAuthInfo; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.Collections; +import java.util.stream.Collectors; + +/** + * Spring Security 用户认证对象 + */ +@Data +@NoArgsConstructor +public class SysUserDetails implements UserDetails { + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + /** + * 账号是否启用(true:启用,false:禁用) + */ + private Boolean enabled; + + /** + * 用户角色权限集合 + */ + private Collection authorities; + + /** + * 构造函数:根据用户认证信息初始化用户详情对象 + * + * @param user 用户认证信息对象 {@link UserAuthInfo} + */ + public SysUserDetails(UserAuthInfo user) { + this.userId = user.getUserId(); + this.username = user.getUsername(); + this.password = user.getPassword(); + this.enabled = ObjectUtil.equal(user.getStatus(), 1); + + // 初始化角色权限集合 + this.authorities = CollectionUtil.isNotEmpty(user.getRoles()) + ? user.getRoles().stream() + // 角色名加上前缀 "ROLE_",用于区分角色 (ROLE_ADMIN) 和权限 (user:add) + .map(role -> new SimpleGrantedAuthority(SecurityConstants.ROLE_PREFIX + role)) + .collect(Collectors.toSet()) + : Collections.emptySet(); + } + + + @Override + public Collection getAuthorities() { + return this.authorities; + } + + @Override + public String getPassword() { + return this.password; + } + + @Override + public String getUsername() { + return this.username; + } + + @Override + public boolean isEnabled() { + return this.enabled; + } +} diff --git a/src/main/java/com/qyft/gd/system/service/AuthService.java b/src/main/java/com/qyft/gd/system/service/AuthService.java index b37416f..d0d9092 100644 --- a/src/main/java/com/qyft/gd/system/service/AuthService.java +++ b/src/main/java/com/qyft/gd/system/service/AuthService.java @@ -1,13 +1,10 @@ package com.qyft.gd.system.service; -import com.qyft.gd.system.model.AuthenticationToken; +import com.qyft.gd.system.security.model.AuthenticationToken; /** * 认证服务接口 - * - * @author Ray.Hao - * @since 2.4.0 */ public interface AuthService { diff --git a/src/main/java/com/qyft/gd/system/service/impl/AuthServiceImpl.java b/src/main/java/com/qyft/gd/system/service/impl/AuthServiceImpl.java index f5fd622..6f7469d 100644 --- a/src/main/java/com/qyft/gd/system/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/qyft/gd/system/service/impl/AuthServiceImpl.java @@ -5,7 +5,7 @@ import com.qyft.gd.system.common.constant.SecurityConstants; import com.qyft.gd.system.common.exception.BusinessException; import com.qyft.gd.system.common.result.ResultCode; import com.qyft.gd.system.common.utils.SecurityUtils; -import com.qyft.gd.system.model.AuthenticationToken; +import com.qyft.gd.system.security.model.AuthenticationToken; import com.qyft.gd.system.security.TokenManager; import com.qyft.gd.system.service.AuthService; import lombok.RequiredArgsConstructor; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bf6a633..59f6a5b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -28,7 +28,7 @@ logging: # 安全配置 security: - enabled: false + enabled: true session: # 会话方式,支持 jwt、redis-token type: jwt