refactor permission system

This commit is contained in:
Timi
2026-08-11 23:57:59 +08:00
parent 6e43ff349d
commit 39ac73dc66
60 changed files with 2300 additions and 335 deletions
@@ -1,29 +0,0 @@
package com.imyeyu.api.annotation;
import com.imyeyu.api.bean.RoleMatchMode;
import com.imyeyu.api.bean.CoreRoleCode;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
///
/// 要求 CORE 模块角色
///
/// @author Codex
/// @since 2026-07-26
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireCoreRole {
/// 所需角色
///
/// @return 角色列表
CoreRoleCode[] value();
/// 匹配模式
///
/// @return 匹配模式
RoleMatchMode mode() default RoleMatchMode.ALL;
}
@@ -1,46 +0,0 @@
package com.imyeyu.api.annotation;
import com.imyeyu.api.bean.ModuleCode;
import com.imyeyu.api.bean.RoleMatchMode;
import com.imyeyu.api.bean.CoreRoleCode;
import com.imyeyu.api.modules.user.service.RoleChecker;
import com.imyeyu.java.TimiJava;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
///
/// CORE 角色注解处理器
///
/// @author Codex
/// @since 2026-07-27
@Component
public class RequireCoreRoleInterceptor implements HandlerInterceptor {
private final RoleChecker roleChecker;
public RequireCoreRoleInterceptor(RoleChecker roleChecker) {
this.roleChecker = roleChecker;
}
@Override
public boolean preHandle(@NonNull HttpServletRequest req, @NonNull HttpServletResponse resp, @NonNull Object handler) {
if (!(handler instanceof HandlerMethod handlerMethod)) {
return true;
}
RequireCoreRole annotation = handlerMethod.getMethodAnnotation(RequireCoreRole.class);
if (annotation == null || TimiJava.isEmpty(annotation.value())) {
return true;
}
String[] roleCodeList = java.util.Arrays.stream(annotation.value()).map(CoreRoleCode::name).toArray(String[]::new);
if (annotation.mode() == RoleMatchMode.ANY) {
roleChecker.checkAny(ModuleCode.CORE, roleCodeList);
} else {
roleChecker.checkAll(ModuleCode.CORE, roleCodeList);
}
return true;
}
}