diff --git a/blade-core-secure/src/main/java/org/springblade/core/secure/utils/SecureUtil.java b/blade-core-secure/src/main/java/org/springblade/core/secure/utils/SecureUtil.java index 2d385c6..aceb71f 100644 --- a/blade-core-secure/src/main/java/org/springblade/core/secure/utils/SecureUtil.java +++ b/blade-core-secure/src/main/java/org/springblade/core/secure/utils/SecureUtil.java @@ -174,7 +174,7 @@ public class SecureUtil { * @return boolean */ public static boolean isAdministrator() { - return StringUtil.containsAny(getUserRole(), RoleConstant.ADMINISTRATOR); + return hasRole(RoleConstant.ADMINISTRATOR); } /** @@ -183,7 +183,17 @@ public class SecureUtil { * @return boolean */ public static boolean isAdmin() { - return StringUtil.containsAny(getUserRole(), RoleConstant.ADMIN); + return hasRole(RoleConstant.ADMIN); + } + + /** + * 判定当前会话是否持有指定角色 + * + * @param role 角色别名 + * @return boolean + */ + private static boolean hasRole(String role) { + return CollectionUtil.contains(Func.toStrArray(getUserRole()), role); } /** diff --git a/blade-starter-tenant/src/main/java/org/springblade/core/tenant/TenantGuard.java b/blade-starter-tenant/src/main/java/org/springblade/core/tenant/TenantGuard.java index 1ec952b..c85ff08 100644 --- a/blade-starter-tenant/src/main/java/org/springblade/core/tenant/TenantGuard.java +++ b/blade-starter-tenant/src/main/java/org/springblade/core/tenant/TenantGuard.java @@ -20,6 +20,7 @@ import org.springblade.core.secure.utils.SecureUtil; import org.springblade.core.tenant.exception.TenantException; import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.ReflectUtil; +import org.springblade.core.tool.utils.StringUtil; import java.lang.reflect.Method; import java.util.Collections; @@ -100,7 +101,8 @@ public class TenantGuard { /** * 提交时(新增 / 修改)的租户绑定守卫 *
- * 新增(id 为空):超管放行,非超管强制写入当前会话 tenantId,避免前端注入。
+ * 非超管一律以会话 tenantId 覆盖入参,杜绝伪造归属;超管保留跨租户建数据的能力,仅在入参未携带
+ * tenantId 时兜底为会话 tenantId —— 业务表单未必向超管暴露租户选择项,不兜底则记录会以空归属落库,
+ * 脱离所有租户的数据范围且无法被租户条件检索。
+ */
+ private static void bindTenantOnCreate(Object entity) {
+ if (!SecureUtil.isAdministrator() || StringUtil.isBlank(tenantIdOf(entity))) {
+ bindTenantId(entity, SecureUtil.getTenantId());
+ }
+ }
+
/**
* 校验批量 ids 全部归属当前会话租户,并返回查询出的实体列表
*
@@ -143,12 +158,14 @@ public class TenantGuard {
if (CollectionUtil.isEmpty(ids)) {
return Collections.emptyList();
}
- List
+ * 新增(id 为空):非超管强制写入当前会话 tenantId 避免前端注入;超管保留指定归属租户的能力,
+ * 入参未指定时兜底为会话 tenantId。
* 修改(id 不空):调用 {@link #verify} 校验归属,并把已存在实体的 tenantId 回写到入参,防止 update 篡改。
*
* @param service MyBatis-Plus IService 实例
@@ -112,13 +114,13 @@ public class TenantGuard {
public static