From e03da0e12649adf9a29aaa1e7e0ef38452b3e9e2 Mon Sep 17 00:00:00 2001 From: volimc Date: Fri, 15 Aug 2025 09:21:16 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3SqlFilterArgumentResolver?= =?UTF-8?q?=E4=B8=AD=E5=8F=82=E6=95=B0=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=EF=BC=8C=E5=B9=B6=E8=AE=BE=E7=BD=AE=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/mybatis/resolver/SqlFilterArgumentResolver.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index dc1083930..2a99b06bd 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -18,6 +18,7 @@ package com.pig4cloud.pig.common.mybatis.resolver; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; @@ -77,11 +78,11 @@ public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver Page page = new Page<>(); if (StrUtil.isNotBlank(current)) { - page.setCurrent(Long.parseLong(current)); + page.setCurrent(Convert.toLong(current, 0L)); } if (StrUtil.isNotBlank(size)) { - page.setSize(Long.parseLong(size)); + page.setSize(Convert.toLong(size, 10L)); } List orderItemList = new ArrayList<>(); -- Gitee From 705d3b3d39bbdf03fefaf2e4855a2710588ff105 Mon Sep 17 00:00:00 2001 From: volimc Date: Fri, 15 Aug 2025 10:05:45 +0800 Subject: [PATCH 2/4] =?UTF-8?q?PigUser=E5=A2=9E=E5=8A=A0=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AFid=E5=B1=9E=E6=80=A7=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pig/common/security/service/PigUser.java | 8 ++++++++ .../security/service/PigUserDetailsService.java | 17 ++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java index 4a0c63dd9..77ce8b507 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java @@ -19,6 +19,7 @@ package com.pig4cloud.pig.common.security.service; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Getter; +import lombok.Setter; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.SpringSecurityCoreVersion; import org.springframework.security.core.userdetails.User; @@ -65,6 +66,13 @@ public class PigUser extends User implements OAuth2AuthenticatedPrincipal { @Getter private final String phone; + /** + * 客户端id + */ + @Getter + @Setter + private String clientId; + public PigUser(Long id, Long deptId, String username, String password, String phone, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection authorities) { diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java index e481051a7..cac9abda7 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java @@ -25,12 +25,25 @@ import java.util.Set; */ public interface PigUserDetailsService extends UserDetailsService, Ordered { + /** + * 参数持有 + */ + class ParamsHolder { + + /** + * 当前客户端id + */ + private static String currentClientId = ""; + } + /** * 是否支持此客户端校验 * @param clientId 目标客户端 + * @param grantType grantType * @return true/false */ default boolean support(String clientId, String grantType) { + ParamsHolder.currentClientId = clientId; return true; } @@ -61,9 +74,11 @@ public interface PigUserDetailsService extends UserDetailsService, Ordered { .createAuthorityList(dbAuthsSet.toArray(new String[0])); // 构造security用户 - return new PigUser(info.getUserId(), info.getDept().getDeptId(), info.getUsername(), + PigUser pigUser = new PigUser(info.getUserId(), info.getDept().getDeptId(), info.getUsername(), SecurityConstants.BCRYPT + info.getPassword(), info.getPhone(), true, true, true, StrUtil.equals(info.getLockFlag(), CommonConstants.STATUS_NORMAL), authorities); + pigUser.setClientId(ParamsHolder.currentClientId); + return pigUser; } /** -- Gitee From 9d4a8a2f18ef09eb75698433dd8ec66aa1c26c74 Mon Sep 17 00:00:00 2001 From: volimc Date: Fri, 15 Aug 2025 10:25:36 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E@isClient=E6=B3=A8?= =?UTF-8?q?=E8=A7=A3=EF=BC=8C=E9=98=B2=E6=AD=A2=E8=AE=A4=E8=AF=81=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=B7=A8=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/constant/SecurityConstants.java | 2 + .../common/security/annotation/IsClient.java | 23 +++++++++ .../security/component/IsClientAspect.java | 49 +++++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + 4 files changed, 75 insertions(+) create mode 100644 pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/IsClient.java create mode 100644 pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/IsClientAspect.java diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java index 5ee751b93..89db99508 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/constant/SecurityConstants.java @@ -32,6 +32,8 @@ public interface SecurityConstants { */ String PROJECT_PREFIX = "pig"; + String PIG = "pig"; + /** * 项目的license */ diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/IsClient.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/IsClient.java new file mode 100644 index 000000000..57380d9ce --- /dev/null +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/IsClient.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pig.common.security.annotation; + +import com.pig4cloud.pig.common.core.constant.SecurityConstants; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 判断登录用户是指定的客户端id注解 + * @author volimc + * @date 2025/8/15 + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +public @interface IsClient { + + /** + * 客户端id,默认PIG + */ + String clientId() default SecurityConstants.PIG; +} diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/IsClientAspect.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/IsClientAspect.java new file mode 100644 index 000000000..e216e64eb --- /dev/null +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/IsClientAspect.java @@ -0,0 +1,49 @@ +package com.pig4cloud.pig.common.security.component; + +import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pig.common.security.annotation.IsClient; +import com.pig4cloud.pig.common.security.service.PigUser; +import com.pig4cloud.pig.common.security.util.SecurityUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.security.access.AccessDeniedException; + +/** + * 判断用户客户端切面 + * @author volimc + * @date 2025/8/15 + */ +@Aspect +@Order(Ordered.HIGHEST_PRECEDENCE + 2) +public class IsClientAspect { + + @Before("@within(isClient) || @annotation(isClient)") + public void around(JoinPoint point, IsClient isClient) { + if (isClient == null) { + Class clazz = point.getTarget().getClass(); + isClient = AnnotationUtils.findAnnotation(clazz, IsClient.class); + } + if (isClient != null) { + String clientId = isClient.clientId(); + if (!isClient(clientId)){ + throw new AccessDeniedException("Client is denied"); + } + } + } + + public boolean isClient(String clientId){ + if (StrUtil.isEmpty(clientId)){ + return false; + } + PigUser pigUser = SecurityUtils.getUser(); + if (pigUser != null && !StrUtil.isEmpty(pigUser.getClientId())){ + return pigUser.getClientId().equals(clientId); + } + return false; + } + +} diff --git a/pig-common/pig-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pig-common/pig-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 6e5c51f0a..da3adf321 100644 --- a/pig-common/pig-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/pig-common/pig-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -5,3 +5,4 @@ com.pig4cloud.pig.common.security.service.PigRedisOAuth2AuthorizationConsentServ com.pig4cloud.pig.common.security.component.PigSecurityInnerAspect com.pig4cloud.pig.common.security.component.PigSecurityMessageSourceConfiguration com.pig4cloud.pig.common.security.service.PigRemoteRegisteredClientRepository +com.pig4cloud.pig.common.security.component.IsClientAspect -- Gitee From cab2ae5970fc066b1c8756af94e38856d1e55586 Mon Sep 17 00:00:00 2001 From: volimc Date: Fri, 15 Aug 2025 09:21:16 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3SqlFilterArgumentResolver?= =?UTF-8?q?=E4=B8=AD=E5=8F=82=E6=95=B0=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=EF=BC=8C=E5=B9=B6=E8=AE=BE=E7=BD=AE=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/mybatis/resolver/SqlFilterArgumentResolver.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index dc1083930..2a99b06bd 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -18,6 +18,7 @@ package com.pig4cloud.pig.common.mybatis.resolver; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; @@ -77,11 +78,11 @@ public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver Page page = new Page<>(); if (StrUtil.isNotBlank(current)) { - page.setCurrent(Long.parseLong(current)); + page.setCurrent(Convert.toLong(current, 0L)); } if (StrUtil.isNotBlank(size)) { - page.setSize(Long.parseLong(size)); + page.setSize(Convert.toLong(size, 10L)); } List orderItemList = new ArrayList<>(); -- Gitee