diff --git a/njzscloud-common/njzscloud-common-cache/pom.xml b/njzscloud-common/njzscloud-common-cache/pom.xml
index e1a2f1e..34956ab 100644
--- a/njzscloud-common/njzscloud-common-cache/pom.xml
+++ b/njzscloud-common/njzscloud-common-cache/pom.xml
@@ -28,6 +28,7 @@
com.njzscloud
njzscloud-common-redis
+ provided
diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/api.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/api.btl
index d038c49..a8450b6 100644
--- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/api.btl
+++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/api.btl
@@ -6,7 +6,7 @@ var dc = toDashCase(lcc);
var pageVueName = ucc + ".vue";
var formVueName = ucc + "Form.vue";
-var pageTsName = dc + ".ts";
+var pageTsName = "page.ts";
var apiTsName = dc + "-api.ts";
var dTsName = dc + ".d.ts";
%>
diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/d.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/d.btl
index 5548772..a593cd0 100644
--- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/d.btl
+++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/d.btl
@@ -6,7 +6,7 @@ var dc = toDashCase(lcc);
var pageVueName = ucc + ".vue";
var formVueName = ucc + "Form.vue";
-var pageTsName = dc + ".ts";
+var pageTsName = "page.ts";
var apiTsName = dc + "-api.ts";
var dTsName = dc + ".d.ts";
%>
diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/form_vue.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/form_vue.btl
index 6d9ab11..59a5594 100644
--- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/form_vue.btl
+++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/form_vue.btl
@@ -6,7 +6,7 @@ var dc = toDashCase(lcc);
var pageVueName = ucc + ".vue";
var formVueName = ucc + "Form.vue";
-var pageTsName = dc + ".ts";
+var pageTsName = "page.ts";
var apiTsName = dc + "-api.ts";
var dTsName = dc + ".d.ts";
%>
diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page.btl
index a00a8d1..a331378 100644
--- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page.btl
+++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page.btl
@@ -6,7 +6,7 @@ var dc = toDashCase(lcc);
var pageVueName = ucc + ".vue";
var formVueName = ucc + "Form.vue";
-var pageTsName = dc + ".ts";
+var pageTsName = "page.ts";
var apiTsName = dc + "-api.ts";
var dTsName = dc + ".d.ts";
%>
diff --git a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page_vue.btl b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page_vue.btl
index fe75122..98e867e 100644
--- a/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page_vue.btl
+++ b/njzscloud-common/njzscloud-common-gen/src/main/resources/templates/ts/page_vue.btl
@@ -6,7 +6,7 @@ var dc = toDashCase(lcc);
var pageVueName = ucc + ".vue";
var formVueName = ucc + "Form.vue";
-var pageTsName = dc + ".ts";
+var pageTsName = "page.ts";
var apiTsName = dc + "-api.ts";
var dTsName = dc + ".d.ts";
%>
diff --git a/njzscloud-common/njzscloud-common-mvc/src/main/java/com/njzscloud/common/mvc/validator/Constrained.java b/njzscloud-common/njzscloud-common-mvc/src/main/java/com/njzscloud/common/mvc/validator/Constrained.java
index 1574587..ff411b7 100644
--- a/njzscloud-common/njzscloud-common-mvc/src/main/java/com/njzscloud/common/mvc/validator/Constrained.java
+++ b/njzscloud-common/njzscloud-common-mvc/src/main/java/com/njzscloud/common/mvc/validator/Constrained.java
@@ -1,5 +1,7 @@
package com.njzscloud.common.mvc.validator;
public interface Constrained {
- ValidRule[] rules();
+ default ValidRule[] rules() {
+ return new ValidRule[0];
+ }
}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityAutoConfiguration.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityAutoConfiguration.java
index db2acc0..f7f2be9 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityAutoConfiguration.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityAutoConfiguration.java
@@ -2,6 +2,8 @@ package com.njzscloud.common.security.config;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
+import com.njzscloud.common.security.controller.PermissionController;
+import com.njzscloud.common.security.controller.VerificationCodeController;
import com.njzscloud.common.security.handler.AccessDeniedExceptionHandler;
import com.njzscloud.common.security.handler.AuthExceptionHandler;
import com.njzscloud.common.security.handler.LogoutPostHandler;
@@ -11,10 +13,11 @@ import com.njzscloud.common.security.module.password.PasswordAuthenticationProvi
import com.njzscloud.common.security.module.password.PasswordLoginPreparer;
import com.njzscloud.common.security.module.wechat.mini.WechatMiniAuthenticationProvider;
import com.njzscloud.common.security.module.wechat.mini.WechatMiniLoginPreparer;
-import com.njzscloud.common.security.permission.DefaultPermissionManager;
+import com.njzscloud.common.security.permission.DefaultPermissionLoader;
+import com.njzscloud.common.security.permission.PermissionLoader;
import com.njzscloud.common.security.permission.PermissionManager;
import com.njzscloud.common.security.support.*;
-import com.njzscloud.common.security.support.controller.VerificationCodeController;
+import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.ObjectProvider;
@@ -54,9 +57,19 @@ public class WebSecurityAutoConfiguration {
}
@Bean
- @ConditionalOnMissingBean(PermissionManager.class)
- public PermissionManager permissionManager() {
- return new DefaultPermissionManager();
+ @ConditionalOnMissingBean(PermissionLoader.class)
+ public PermissionLoader permissionLoader() {
+ return new DefaultPermissionLoader();
+ }
+
+ @Bean
+ public PermissionController permissionController(PermissionManager permissionManager) {
+ return new PermissionController(permissionManager);
+ }
+
+ @Bean
+ public PermissionManager permissionManager(PermissionLoader permissionLoader) {
+ return new PermissionManager(permissionLoader);
}
@Bean
@@ -135,7 +148,7 @@ public class WebSecurityAutoConfiguration {
List loginPreparers = loginPreparerObjectProvider.orderedStream().collect(Collectors.toList());
List authenticationProviders = abstractAuthenticationProviderObjectProvider.orderedStream().collect(Collectors.toList());
ProviderManager providerManager = new ProviderManager(authenticationProviders);
-
+ String[] authAllows = webSecurityProperties.getAuthAllows().toArray(new String[0]);
LogoutPostHandler logoutPostHandler = new LogoutPostHandler();
return http
@@ -146,15 +159,17 @@ public class WebSecurityAutoConfiguration {
.securityContext(it -> it.securityContextRepository(new TokenSecurityContextRepository()))
.authorizeHttpRequests(it -> it
+ .requestMatchers(authAllows).permitAll()
.anyRequest()
.access((AuthorizationManager) (authentication, object) -> {
// 获取当前请求路径
- String requestPath = object.getRequest().getRequestURI();
+ HttpServletRequest request = object.getRequest();
// 获取当前认证用户
Authentication auth = authentication.get();
+ int vote = permissionManager.vote(auth, request);
- return new AuthorizationDecision(true);
+ return new AuthorizationDecision(vote >= 0);
})
)
// .addFilter(securityInterceptor)
@@ -181,7 +196,7 @@ public class WebSecurityAutoConfiguration {
if (CollUtil.isNotEmpty(authIgnore)) {
ignoring.requestMatchers(ArrayUtil.toArray(authIgnore, String.class));
}
- ignoring.requestMatchers("/error");
+ // ignoring.requestMatchers("/error");
};
}
}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityProperties.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityProperties.java
index b36d348..fed22db 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityProperties.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/config/WebSecurityProperties.java
@@ -20,5 +20,9 @@ public class WebSecurityProperties {
* 不进行认证校验的路径, 按 Ant 格式匹配
*/
private Set authIgnores = CollUtil.empty(Set.class);
+ /**
+ * 允许匿名访问
+ */
+ private Set authAllows = CollUtil.empty(Set.class);
}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/ClientCode.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/ClientCode.java
index 012055d..3c2e700 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/ClientCode.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/ClientCode.java
@@ -1,9 +1,14 @@
package com.njzscloud.common.security.contant;
+import cn.hutool.core.collection.CollUtil;
import com.njzscloud.common.core.ienum.DictInt;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
/**
* 字典代码:client_code
* 字典名称:客户端代码
@@ -11,21 +16,43 @@ import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum ClientCode implements DictInt {
- PC(0, "电脑端"),
- WX_MINI_APP(1, "微信小程序"),
+ PC(1, "电脑端"),
+ WX_MINI_APP(2, "微信小程序"),
;
private final Integer val;
private final String txt;
+ public static int getClientCode(List clients) {
+ if (CollUtil.isEmpty(clients)) return 0;
+ var clientCode = 0;
+ for (var client : clients) {
+ clientCode |= client;
+ }
+ return clientCode;
+ }
+
+ public static List getClients(int clientCode) {
+ return Arrays.stream(ClientCode.class.getEnumConstants()).filter(it -> it.hasClient(clientCode)).toList();
+ }
+
+ public static boolean valid(int clientCode) {
+
+ Optional max = Arrays.stream(ClientCode.class.getEnumConstants())
+ .map(ClientCode::getVal)
+ .reduce((a, b) -> a | b);
+ return max.orElse(0) >= clientCode;
+ }
+
+ public static Optional getClient(int clientCode) {
+ return Arrays.stream(ClientCode.class.getEnumConstants()).filter(it -> it.hasClient(clientCode)).findFirst();
+ }
+
/**
* 检查是否有登录权限
*/
- public boolean hasPermission(int clientCode) {
- var mask = 1 << this.val;
- return (clientCode & mask) == 0;
+ public boolean hasClient(int clientCode) {
+ return (this.val & clientCode) != 0;
}
}
-
-
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/Constants.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/Constants.java
index 0687f90..b4d8694 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/Constants.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/contant/Constants.java
@@ -13,6 +13,7 @@ public final class Constants {
public static final String ROLE_AUTHENTICATED = "ROLE_AUTHENTICATED";
public static final String ROLE_ANONYMOUS = "ROLE_ANONYMOUS";
public static final String ROLE_ADMIN = "ROLE_ADMIN";
+ public static final String ROLE_NONE = "ROLE_NONE";
// Redis 订阅频道 权限更新
public static final String REDIS_TOPIC_PERMISSION_UPDATE = "permission_update";
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/PermissionController.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/PermissionController.java
new file mode 100644
index 0000000..a862a89
--- /dev/null
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/PermissionController.java
@@ -0,0 +1,23 @@
+package com.njzscloud.common.security.controller;
+
+import com.njzscloud.common.core.utils.R;
+import com.njzscloud.common.security.permission.PermissionManager;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("/permission")
+@RequiredArgsConstructor
+public class PermissionController {
+ private final PermissionManager permissionManager;
+
+ @GetMapping("/refresh_cache")
+ public R> refresh() {
+ permissionManager.refresh();
+ return R.success();
+ }
+}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/controller/VerificationCodeController.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/VerificationCodeController.java
similarity index 93%
rename from njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/controller/VerificationCodeController.java
rename to njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/VerificationCodeController.java
index 1f0314a..27f5ccb 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/controller/VerificationCodeController.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/controller/VerificationCodeController.java
@@ -1,4 +1,4 @@
-package com.njzscloud.common.security.support.controller;
+package com.njzscloud.common.security.controller;
import com.njzscloud.common.core.utils.R;
import com.njzscloud.common.security.support.VerificationCodeService;
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/DefaultPermissionLoader.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/DefaultPermissionLoader.java
new file mode 100644
index 0000000..752ff29
--- /dev/null
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/DefaultPermissionLoader.java
@@ -0,0 +1,14 @@
+package com.njzscloud.common.security.permission;
+
+import java.util.List;
+
+/**
+ * 默认权限管理器
+ * 所有接口都必须登录后才能访问
+ */
+public class DefaultPermissionLoader implements PermissionLoader {
+ @Override
+ public List load() {
+ return null;
+ }
+}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/DefaultPermissionManager.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/DefaultPermissionManager.java
deleted file mode 100644
index 1b56dea..0000000
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/DefaultPermissionManager.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.njzscloud.common.security.permission;
-
-import com.njzscloud.common.security.contant.EndpointAccessModel;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * 默认权限管理器
- * 所有接口都必须登录后才能访问
- */
-public class DefaultPermissionManager extends PermissionManager {
-
- private final List DEFAULT_ROLE_PERMISSIONS = Collections.singletonList(
- new RolePermission()
- .setEndpoint("/**")
- .setAccessModel(EndpointAccessModel.LOGINED)
- );
-
- @Override
- protected List load() {
- return DEFAULT_ROLE_PERMISSIONS;
- }
-}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionLoader.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionLoader.java
new file mode 100644
index 0000000..a217719
--- /dev/null
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionLoader.java
@@ -0,0 +1,7 @@
+package com.njzscloud.common.security.permission;
+
+import java.util.List;
+
+public interface PermissionLoader {
+ List load();
+}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionManager.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionManager.java
index 67bd9f7..a7b9e58 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionManager.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionManager.java
@@ -1,14 +1,19 @@
package com.njzscloud.common.security.permission;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.njzscloud.common.security.contant.Constants;
import com.njzscloud.common.security.contant.EndpointAccessModel;
import com.njzscloud.common.security.ex.ForbiddenAccessException;
+import com.njzscloud.common.security.ex.MissingPermissionException;
import jakarta.servlet.http.HttpServletRequest;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher;
import java.util.*;
@@ -18,7 +23,9 @@ import java.util.concurrent.locks.ReentrantLock;
* 权限管理器
*/
@Slf4j
-public abstract class PermissionManager {
+@RequiredArgsConstructor
+public class PermissionManager {
+ private static final int ACCESS_GRANTED = 1;
private static final ReentrantLock PERMISSION_CACHE_LOCK = new ReentrantLock();
/**
@@ -27,6 +34,27 @@ public abstract class PermissionManager {
private Map> PERMISSION_CACHE;
private Set FORBIDDEN_CACHE;
+ private static final int ACCESS_ABSTAIN = 0;
+ private static final int ACCESS_DENIED = -1;
+ private final PermissionLoader permissionLoader;
+
+ public int vote(Authentication authentication, HttpServletRequest request) {
+ Collection attributes = extractAuthorities(request);
+ if (authentication == null) {
+ return ACCESS_DENIED;
+ }
+ int result = ACCESS_ABSTAIN;
+ Collection extends GrantedAuthority> authorities = authentication.getAuthorities();
+ for (String attribute : attributes) {
+ result = ACCESS_DENIED;
+ for (GrantedAuthority authority : authorities) {
+ if (attribute.equals(authority.getAuthority())) {
+ return ACCESS_GRANTED;
+ }
+ }
+ }
+ return result;
+ }
/**
* 刷新本地权限缓存
@@ -68,9 +96,10 @@ public abstract class PermissionManager {
private void load0() {
// if (log.isDebugEnabled()) log.debug("开始加载权限");
- List rolePermissions = load();
+ List rolePermissions = permissionLoader.load();
+ if (rolePermissions == null) rolePermissions = new ArrayList<>();
- if (rolePermissions == null) rolePermissions = Collections.emptyList();
+ rolePermissions.add(RolePermission.DEFAULT);
Map> permissionMap = new LinkedHashMap<>();
@@ -80,7 +109,7 @@ public abstract class PermissionManager {
String endpoint = rolePermission.getEndpoint();
String method = rolePermission.getMethod();
EndpointAccessModel accessModel = rolePermission.getAccessModel();
- HttpMethod httpMethod = HttpMethod.valueOf(method);
+ HttpMethod httpMethod = method == null ? null : HttpMethod.valueOf(method);
PathPatternRequestMatcher pathRequestMatcher = PathPatternRequestMatcher.withDefaults().matcher(httpMethod, endpoint);
if (accessModel == EndpointAccessModel.FORBIDDEN) {
forbiddenSet.add(pathRequestMatcher);
@@ -97,6 +126,7 @@ public abstract class PermissionManager {
} else if (accessModel == EndpointAccessModel.AUTHENTICATED) {
String role = rolePermission.getRole();
if (StrUtil.isNotBlank(role)) configAttributes.add(role);
+ else configAttributes.add(Constants.ROLE_NONE);
}
}
@@ -106,13 +136,6 @@ public abstract class PermissionManager {
// if (log.isDebugEnabled()) log.debug("本地权限缓存已加载:\n{}", Jackson.toJsonStr(this.getAllRelation()));
}
- /**
- * 加载权限
- *
- * @return List<RolePermission>
- */
- abstract protected List load();
-
/**
* 获取当前请求所需要的角色
*
@@ -138,6 +161,16 @@ public abstract class PermissionManager {
return CollUtil.empty(Set.class);
}
+ public Collection getAttributes(HttpServletRequest request) {
+ Collection permission = this.extractAuthorities(request);
+ String requestURI = request.getRequestURI();
+ String method = request.getMethod();
+ String endpoint = method.toUpperCase() + " " + requestURI;
+
+ Assert.notEmpty(permission, () -> new MissingPermissionException(StrUtil.format("请求: 【{}】 未指定权限", endpoint)));
+ return permission;
+ }
+
/**
* 获取所有角色
*
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionSecurityMetaDataSource.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionSecurityMetaDataSource.java
deleted file mode 100644
index ec3b923..0000000
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionSecurityMetaDataSource.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.njzscloud.common.security.permission;
-
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.StrUtil;
-import com.njzscloud.common.security.ex.MissingPermissionException;
-import jakarta.servlet.http.HttpServletRequest;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.web.FilterInvocation;
-
-import java.util.Collection;
-
-@Slf4j
-@RequiredArgsConstructor
-public class PermissionSecurityMetaDataSource {
-
- // org.springframework.security.config.annotation.web.configurers.UrlAuthorizationConfigurer
- // org.springframework.security.access.vote.RoleVoter PermissionAuthorizationConfigurer
-
- private final PermissionManager permissionManager;
- // private final boolean rejectPublicInvocations;
-
-
- public Collection getAttributes(Object object) throws IllegalArgumentException {
- HttpServletRequest request = ((FilterInvocation) object).getRequest();
- Collection permission = permissionManager.extractAuthorities(request);
- String requestURI = request.getRequestURI();
- String method = request.getMethod();
- String endpoint = method.toUpperCase() + " " + requestURI;
-
- Assert.notEmpty(permission, () -> new MissingPermissionException(StrUtil.format("请求: 【{}】 未指定权限", endpoint)));
- // if (log.isDebugEnabled()) log.debug("允许访问接口:【{}】的角色:【{}】", endpoint, permission);
- return permission;
- }
-
- public Collection getAllConfigAttributes() {
- return permissionManager.getAll();
- }
-
- public boolean supports(Class> clazz) {
- return FilterInvocation.class.isAssignableFrom(clazz);
- }
-}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionVoter.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionVoter.java
index 2215062..d0c2472 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionVoter.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/PermissionVoter.java
@@ -23,23 +23,13 @@ public class PermissionVoter {
int result = ACCESS_ABSTAIN;
Collection extends GrantedAuthority> authorities = authentication.getAuthorities();
for (String attribute : attributes) {
- if (this.supports(attribute)) {
- result = ACCESS_DENIED;
- for (GrantedAuthority authority : authorities) {
- if (attribute.equals(authority.getAuthority())) {
- return ACCESS_GRANTED;
- }
+ result = ACCESS_DENIED;
+ for (GrantedAuthority authority : authorities) {
+ if (attribute.equals(authority.getAuthority())) {
+ return ACCESS_GRANTED;
}
}
}
return result;
}
-
- public boolean supports(String attribute) {
- return true;
- }
-
- public boolean supports(Class> clazz) {
- return true;
- }
}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/RolePermission.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/RolePermission.java
index be7c374..c99e794 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/RolePermission.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/permission/RolePermission.java
@@ -12,6 +12,9 @@ import lombok.experimental.Accessors;
@Setter
@Accessors(chain = true)
public class RolePermission {
+ public static RolePermission DEFAULT = new RolePermission()
+ .setEndpoint("/**")
+ .setAccessModel(EndpointAccessModel.LOGINED);
/**
* 请求方法
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/AbstractAuthenticationProvider.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/AbstractAuthenticationProvider.java
index 7d13dcf..2ed09ce 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/AbstractAuthenticationProvider.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/AbstractAuthenticationProvider.java
@@ -116,7 +116,8 @@ public abstract class AbstractAuthenticationProvider implements AuthenticationPr
Assert.isFalse(userDetail.getDisabled(), () -> new UserLoginException(ExceptionMsg.CLI_ERR_MSG, "用户已被禁用"));
ClientCode clientCode = loginForm.getClientCode();
Integer code = userDetail.getClientCode();
- Assert.isTrue(clientCode.hasPermission(code), () -> new UserLoginException(ExceptionMsg.CLI_ERR_MSG, "当前用户无权使用:" + clientCode.getTxt()));
+ userDetail.setClient(clientCode.getVal());
+ Assert.isTrue(clientCode.hasClient(code), () -> new UserLoginException(ExceptionMsg.CLI_ERR_MSG, "当前用户无权使用:" + clientCode.getTxt()));
}
/**
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/IAuthService.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/IAuthService.java
index 7a6c162..a135b00 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/IAuthService.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/IAuthService.java
@@ -23,7 +23,7 @@ public interface IAuthService {
return null;
}
- default UserDetail my(Long userId) {
+ default UserDetail my(Long userId, Integer client) {
return null;
}
}
diff --git a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/UserDetail.java b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/UserDetail.java
index a3444d4..eafa11d 100644
--- a/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/UserDetail.java
+++ b/njzscloud-common/njzscloud-common-security/src/main/java/com/njzscloud/common/security/support/UserDetail.java
@@ -44,6 +44,7 @@ public class UserDetail implements CredentialsContainer, Principal {
private Long accountId;
private Long tenantId;
private Integer clientCode;
+ private Integer client;
private String tenantName;
/**
* 登录方式
diff --git a/njzscloud-common/njzscloud-common-sichen/src/main/java/com/njzscloud/common/sichen/config/TaskAutoConfiguration.java b/njzscloud-common/njzscloud-common-sichen/src/main/java/com/njzscloud/common/sichen/config/TaskAutoConfiguration.java
index b5083ea..7556e68 100644
--- a/njzscloud-common/njzscloud-common-sichen/src/main/java/com/njzscloud/common/sichen/config/TaskAutoConfiguration.java
+++ b/njzscloud-common/njzscloud-common-sichen/src/main/java/com/njzscloud/common/sichen/config/TaskAutoConfiguration.java
@@ -18,6 +18,7 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBooleanProperty;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -26,12 +27,14 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
+import javax.sql.DataSource;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.concurrent.ThreadPoolExecutor;
@Slf4j
@Configuration
+@ConditionalOnBean(DataSource.class)
@MapperScan("com.njzscloud.common.sichen.mapper")
@ConditionalOnBooleanProperty(prefix = "sichen.task", name = "enable")
@EnableConfigurationProperties(TaskProperties.class)
diff --git a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/WechatUtil.java b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/WechatUtil.java
index f0e3271..ad5b118 100644
--- a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/WechatUtil.java
+++ b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/WechatUtil.java
@@ -28,10 +28,9 @@ public class WechatUtil {
public synchronized static void auth() {
if (tokenExpTime <= new Date().getTime() / 1000 + 60) {
GetAccessTokenResult getAccessTokenResult = API.getAccessToken(new GetAccessTokenParam());
+ Assert.isTrue(getAccessTokenResult.isSucc(), () -> Exceptions.error("微信登录失败"));
accessToken = getAccessTokenResult.getAccess_token();
Integer expiresIn = getAccessTokenResult.getExpires_in();
- Assert.notBlank(accessToken, () -> Exceptions.error("微信登录失败"));
- Assert.notNull(expiresIn, () -> Exceptions.error("微信登录失败"));
tokenExpTime = new Date().getTime() / 1000 + expiresIn;
}
}
diff --git a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/Code2SessionResult.java b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/Code2SessionResult.java
index cb2940a..df11491 100644
--- a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/Code2SessionResult.java
+++ b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/Code2SessionResult.java
@@ -1,5 +1,6 @@
package com.njzscloud.common.wechat.result;
+import cn.hutool.core.util.StrUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@@ -17,6 +18,6 @@ public class Code2SessionResult {
private Integer errcode;
public boolean isSucc() {
- return errcode != null && errcode == 0;
+ return (errcode != null && errcode == 0) || StrUtil.isNotBlank(openid);
}
}
diff --git a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/GetAccessTokenResult.java b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/GetAccessTokenResult.java
index 0836c36..91a62a0 100644
--- a/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/GetAccessTokenResult.java
+++ b/njzscloud-common/njzscloud-common-wechat/src/main/java/com/njzscloud/common/wechat/result/GetAccessTokenResult.java
@@ -1,5 +1,6 @@
package com.njzscloud.common.wechat.result;
+import cn.hutool.core.util.StrUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@@ -12,4 +13,8 @@ import lombok.experimental.Accessors;
public class GetAccessTokenResult {
private String access_token;
private Integer expires_in;
+
+ public boolean isSucc() {
+ return StrUtil.isNotBlank(access_token) && (expires_in != null && expires_in > 0);
+ }
}
diff --git a/njzscloud-svr/pom.xml b/njzscloud-svr/pom.xml
index ec55a18..f71e53e 100644
--- a/njzscloud-svr/pom.xml
+++ b/njzscloud-svr/pom.xml
@@ -54,10 +54,15 @@
com.njzscloud
njzscloud-common-ws
-
+
com.njzscloud
njzscloud-common-security
diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/customer/controller/CustomerController.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/customer/controller/CustomerController.java
index aaad6fe..4b72f2d 100644
--- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/customer/controller/CustomerController.java
+++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/customer/controller/CustomerController.java
@@ -7,6 +7,8 @@ import com.njzscloud.common.mp.support.PageResult;
import com.njzscloud.common.security.util.SecurityUtil;
import com.njzscloud.dispose.cst.customer.pojo.entity.CustomerEntity;
import com.njzscloud.dispose.cst.customer.pojo.param.AddCustomerParam;
+import com.njzscloud.dispose.cst.customer.pojo.param.SearchCustomerParam;
+import com.njzscloud.dispose.cst.customer.pojo.result.SearchCustomerResult;
import com.njzscloud.dispose.cst.customer.service.CustomerService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -64,7 +66,7 @@ public class CustomerController {
* 详情
*/
@GetMapping("/detail")
- public R detail(@RequestParam Long id) {
+ public R detail(@RequestParam Long id) {
return R.success(customerService.detail(id));
}
@@ -72,7 +74,7 @@ public class CustomerController {
* 分页查询
*/
@GetMapping("/paging")
- public R> paging(PageParam pageParam, CustomerEntity customerEntity) {
- return R.success(customerService.paging(pageParam, customerEntity));
+ public R> paging(PageParam pageParam, SearchCustomerParam searchCustomerParam) {
+ return R.success(customerService.paging(pageParam, searchCustomerParam));
}
}
diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/customer/mapper/CustomerMapper.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/customer/mapper/CustomerMapper.java
index 649e071..79f297b 100644
--- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/customer/mapper/CustomerMapper.java
+++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/customer/mapper/CustomerMapper.java
@@ -1,12 +1,20 @@
package com.njzscloud.dispose.cst.customer.mapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njzscloud.dispose.cst.customer.pojo.entity.CustomerEntity;
+import com.njzscloud.dispose.cst.customer.pojo.result.SearchCustomerResult;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
/**
* 客户信息
*/
@Mapper
public interface CustomerMapper extends BaseMapper {
+ IPage paging(Page
+
+ com.njzscloud
+ njzscloud-common-cache
+ 0.0.1
+
com.njzscloud
njzscloud-common-redis
diff --git a/z-doc/pdma/njzscloud-dispose.pdma b/z-doc/pdma/njzscloud-dispose.pdma
index 3326c3b..a3571f5 100644
--- a/z-doc/pdma/njzscloud-dispose.pdma
+++ b/z-doc/pdma/njzscloud-dispose.pdma
@@ -5899,6 +5899,71 @@
"attr20": "",
"origin": "IMPORT"
},
+ {
+ "id": "7D98C996-2848-4BDB-9A41-27A1E3A209FD",
+ "defKey": "client_code",
+ "defName": "客户端",
+ "intro": "位权码",
+ "baseDataType": "INT",
+ "bizDomainType": "",
+ "dbDataType": "INT",
+ "dataLen": "",
+ "numScale": "",
+ "primaryKey": 0,
+ "notNull": 1,
+ "autoIncrement": 0,
+ "defaultValue": "0",
+ "stndDictId": "",
+ "stndFieldId": "",
+ "stndDictKey": "client_code",
+ "stndFieldKey": "",
+ "stndComplianceLevel": "",
+ "stndComplianceType": "",
+ "dictFrom": "Manual",
+ "dictItems": [
+ {
+ "itemKey": "0",
+ "itemName": "WEB 后台",
+ "intro": "第 0 位",
+ "id": "68123977-C53D-4AAA-9B8E-44CCFFF96518"
+ },
+ {
+ "itemKey": "1",
+ "itemName": "微信小程序",
+ "intro": "第 1 位",
+ "id": "0AB3C4CB-01C5-40E7-8C3C-C5EF71BC4BAC"
+ },
+ {
+ "itemKey": "2",
+ "itemName": "手机 APP",
+ "intro": "第 2 位",
+ "id": "22B26C48-0C87-442F-ABDC-D9E9D2D2DB9D"
+ }
+ ],
+ "fieldTier": "",
+ "mark": null,
+ "attr1": "",
+ "attr2": "",
+ "attr3": "",
+ "attr4": "",
+ "attr5": "",
+ "attr6": "",
+ "attr7": "",
+ "attr8": "",
+ "attr9": "",
+ "attr10": "",
+ "attr11": "",
+ "attr12": "",
+ "attr13": "",
+ "attr14": "",
+ "attr15": "",
+ "attr16": "",
+ "attr17": "",
+ "attr18": "PDManer",
+ "attr19": "68EE2E5E-F775-458D-8686-B8834995C062",
+ "attr20": "",
+ "origin": "UI"
+ },
{
"id": "887EF609-A47C-45A4-942C-8AA5DA81AD76",
"defKey": "sn",
@@ -6240,9 +6305,9 @@
"dataLen": 1,
"numScale": "",
"primaryKey": 0,
- "notNull": 0,
+ "notNull": 1,
"autoIncrement": 0,
- "defaultValue": "",
+ "defaultValue": "0",
"stndDictId": "",
"stndDictKey": "",
"stndFieldId": "",
@@ -6324,9 +6389,9 @@
"dataLen": 128,
"numScale": "",
"primaryKey": 0,
- "notNull": 0,
+ "notNull": 1,
"autoIncrement": 0,
- "defaultValue": "",
+ "defaultValue": "''",
"stndDictId": "",
"stndDictKey": "",
"stndFieldId": "",
@@ -6366,9 +6431,9 @@
"dataLen": 255,
"numScale": "",
"primaryKey": 0,
- "notNull": 0,
+ "notNull": 1,
"autoIncrement": 0,
- "defaultValue": "",
+ "defaultValue": "''",
"stndDictId": "",
"stndFieldId": "",
"stndDictKey": "",
@@ -22933,9 +22998,9 @@
"defKey": "license_start_time",
"defName": "营业执照有效期",
"intro": null,
- "baseDataType": "DATETIME",
+ "baseDataType": "DATE",
"bizDomainType": "",
- "dbDataType": "DATETIME",
+ "dbDataType": "DATE",
"dataLen": null,
"numScale": null,
"primaryKey": 0,
@@ -22979,9 +23044,9 @@
"defKey": "license_end_time",
"defName": "营业执照有效期",
"intro": null,
- "baseDataType": "DATETIME",
+ "baseDataType": "DATE",
"bizDomainType": "",
- "dbDataType": "DATETIME",
+ "dbDataType": "DATE",
"dataLen": null,
"numScale": null,
"primaryKey": 0,
@@ -23117,9 +23182,9 @@
"defKey": "idcard_start_time",
"defName": "法人身份证有效期",
"intro": null,
- "baseDataType": "DATETIME",
+ "baseDataType": "DATE",
"bizDomainType": "",
- "dbDataType": "DATETIME",
+ "dbDataType": "DATE",
"dataLen": "",
"numScale": null,
"primaryKey": 0,
@@ -23163,9 +23228,9 @@
"defKey": "idcard_end_time",
"defName": "法人身份证有效期",
"intro": null,
- "baseDataType": "DATETIME",
+ "baseDataType": "DATE",
"bizDomainType": "",
- "dbDataType": "DATETIME",
+ "dbDataType": "DATE",
"dataLen": "",
"numScale": null,
"primaryKey": 0,
@@ -42968,7 +43033,7 @@
"readonly": false,
"allowWs": false
},
- "updateTime": 1765359635412,
- "signature": "e1b11ecff62865e7eb000c6c88e1e638",
+ "updateTime": 1765434816305,
+ "signature": "f39d1018f0ed556230f3489a43a16da7",
"branchId": "1111"
-}
+}
\ No newline at end of file