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 5ee751b93f8487d94254cd13cdf62f6dc71beeb3..89db99508694353e7862d4058b4baa3b429296a6 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-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 dc10839308c8af9d20add41694caaf9e4b81bef9..2a99b06bd91e564574eef23e2f3f5cf9edd7e670 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<>(); 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 0000000000000000000000000000000000000000..57380d9cea4af5ffed8ed77478769f29060c3b34 --- /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 0000000000000000000000000000000000000000..e216e64eb9c022fde3553e7ee39e215f0dc3bda6 --- /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/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 4a0c63dd9db685fa01d6c9c890230259a01953c9..77ce8b5073318ff402ca40dcbc9cc833af57081f 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 e481051a75f16b9d8fcb1ae83e51b01500455164..cac9abda703c1a5677ac252e0ac039f029f331ed 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; } /** 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 6e5c51f0a5ff43ed64e9a4db833b0cacc99b92db..da3adf32186b1b304af0709cbfe641fc9f0ec2de 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