Browse Source

权限校验部分

skyfffire 2 tháng trước cách đây
mục cha
commit
ab9ca08063

+ 0 - 11
src/main/java/common/interceptor/AuthInterceptor.java

@@ -1,11 +0,0 @@
-package common.interceptor;
-
-import com.jfinal.aop.Interceptor;
-import com.jfinal.aop.Invocation;
-
-public class AuthInterceptor implements Interceptor {
-    @Override
-    public void intercept(Invocation invocation) {
-        invocation.invoke();
-    }
-}

+ 12 - 0
src/main/java/common/interceptor/role/RequiredRoleInterface.java

@@ -0,0 +1,12 @@
+package common.interceptor.role;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface RequiredRoleInterface {
+    int[] value(); // 允许的角色权限ID数组
+}

+ 66 - 0
src/main/java/common/interceptor/role/RoleInterceptor.java

@@ -0,0 +1,66 @@
+package common.interceptor.role;
+
+import com.jfinal.aop.Interceptor;
+import com.jfinal.aop.Invocation;
+import com.jfinal.core.Controller;
+import com.jfinal.kit.StrKit;
+import common.utils.http.MyRet;
+
+public class RoleInterceptor implements Interceptor {
+    // Session 中存储用户角色的 key
+    private static final String SESSION_ROLE_KEY = "role";
+
+    @Override
+    public void intercept(Invocation inv) {
+        // 1. 获取方法上的 RequiredRole 注解
+        RequiredRoleInterface requiredRole = inv.getMethod().getAnnotation(RequiredRoleInterface.class);
+
+        // 如果方法没有 RequiredRole 注解,表示不需要权限检查,直接放行
+        if (requiredRole == null) {
+            inv.invoke();
+            return;
+        }
+
+        // 2. 获取允许的角色数组
+        int[] allowedRoles = requiredRole.value();
+        Controller controller = inv.getController();
+
+        // 3. 从 Session 中获取当前用户的角色
+        String currentUserRoleStr = controller.getSessionAttr(SESSION_ROLE_KEY);
+        Integer currentUserRole = null;
+        // 判断是否为空,不为空则尝试转换为 Integer
+        if (StrKit.notBlank(currentUserRoleStr)) {
+            try {
+                currentUserRole = Integer.parseInt(currentUserRoleStr);
+            } catch (NumberFormatException e) {
+                // 如果 Session 中的 role 字符串无法转换为数字,说明数据有问题
+                controller.renderJson(MyRet.fail("权限校验失败:用户角色数据异常"));
+                return;
+            }
+        }
+
+        // 4. 权限校验逻辑
+        // 如果用户未登录(Session 中没有 role)
+        if (currentUserRole == null) {
+            controller.renderJson(MyRet.fail("权限不足:用户未登录或会话已过期"));
+            return;
+        }
+
+        // 检查当前用户的角色ID是否在允许的角色数组中
+        boolean hasPermission = false;
+        for (int allowedRole : allowedRoles) {
+            if (currentUserRole == allowedRole) {
+                hasPermission = true;
+                break; // 找到匹配的角色,跳出循环
+            }
+        }
+
+        // 5. 根据权限判断是否放行
+        if (hasPermission) {
+            inv.invoke(); // 有权限,放行请求
+        } else {
+            // 没有权限,返回错误信息
+            controller.renderJson(MyRet.fail("权限不足:当前角色无权访问此接口").setCode(MyRet.CODE_NO_POWER));
+        }
+    }
+}

+ 2 - 2
src/main/java/common/jfinal/AppConfig.java

@@ -6,7 +6,7 @@ import com.jfinal.plugin.druid.DruidPlugin;
 import com.jfinal.server.undertow.UndertowServer;
 import com.jfinal.template.Engine;
 import common.handler.AllCorsHandler;
-import common.interceptor.AuthInterceptor;
+import common.interceptor.role.RoleInterceptor;
 import common.interceptor.ExceptionInterceptor;
 import common.interceptor.empty.EmptyInterceptor;
 import common.model._MappingKit;
@@ -72,7 +72,7 @@ public class AppConfig extends JFinalConfig {
         // 配置全局参数拦截校验器
         interceptors.addGlobalActionInterceptor(new EmptyInterceptor());
         // 配置全局权限校验拦截器
-        interceptors.addGlobalActionInterceptor(new AuthInterceptor());
+        interceptors.addGlobalActionInterceptor(new RoleInterceptor());
     }
 
     @Override

+ 2 - 2
src/main/java/modules/hello/HelloController.java

@@ -2,9 +2,9 @@ package modules.hello;
 
 import com.jfinal.aop.Before;
 import com.jfinal.core.Controller;
-import common.interceptor.AuthInterceptor;
+import common.interceptor.role.RoleInterceptor;
 
-@Before(AuthInterceptor.class)
+@Before(RoleInterceptor.class)
 public class HelloController extends Controller {
     public void index() {
         renderText("Hello DaLian.");

+ 7 - 0
src/main/java/modules/upload/UploadController.java

@@ -1,9 +1,14 @@
 package modules.upload;
 
+import com.jfinal.aop.Before;
 import com.jfinal.kit.StrKit;
 import com.jfinal.upload.UploadFile;
+import common.interceptor.LoginInterceptor;
+import common.interceptor.role.RequiredRoleInterface;
+import common.interceptor.role.RoleInterceptor;
 import common.utils.http.MyController;
 import common.utils.http.MyRet;
+import modules.user.UserController;
 
 import java.io.File;
 import java.text.SimpleDateFormat;
@@ -20,6 +25,8 @@ public class UploadController extends MyController {
      * 上传一个文件的方法
      * 前端通过 multipart/form-data 方式,将文件字段命名为 "file" 上传
      */
+    @Before(LoginInterceptor.class)
+    @RequiredRoleInterface({UserController.ROLE_SUPER_ADMIN})
     public void uploadOneFile() {
         // JFinal 会自动将上传的文件保存到 getFile() 第一个参数指定的临时目录
         // 第二个参数是最大上传大小,第三个参数是编码

+ 10 - 6
src/main/java/modules/user/UserController.java

@@ -6,6 +6,7 @@ import com.jfinal.aop.Inject;
 import com.jfinal.kit.HashKit;
 import com.jfinal.kit.StrKit;
 import common.interceptor.LoginInterceptor;
+import common.interceptor.empty.EmptyInterceptor;
 import common.interceptor.empty.EmptyInterface;
 import common.model.User;
 import common.utils.http.MyController;
@@ -13,11 +14,14 @@ import common.utils.http.MyRet;
 import common.utils.http.VerifyCode;
 
 public class UserController extends MyController {
-    // 验证码发送延时
-    private static final long SEND_VERIFY_CODE_DELAY = 60 * 1000;
-
-    // 验证码有效期,5 分钟 (300 秒)
-    private static final long VERIFY_CODE_EXPIRATION_TIME = 5 * 60 * 1000; // 毫秒
+    // 验证码相关的常量
+    private static final long SEND_VERIFY_CODE_DELAY = 60 * 1000;               // 验证码发送间隔
+    private static final long VERIFY_CODE_EXPIRATION_TIME = 5 * 60 * 1000;      // 验证码有效期,5 分钟 (300 秒)
+    
+    // 角色相关常量
+    public static final int ROLE_SUPER_ADMIN = 0;                               // 超级管理员
+    public static final int ROLE_CHECK_ADMIN = 1;                               // 审核管理员
+    public static final int ROLE_USER = 2;                                      // 普通用户
     
     @Inject
     private UserService service;
@@ -25,7 +29,7 @@ public class UserController extends MyController {
     public void hello() {
         renderText(service.hello());
     }
-
+    
     @EmptyInterface(keyArray = {"mobile_number"})
     public void sendVerifyCode() {
         // --- 核心修改部分 ---

+ 1 - 1
src/test/rest/UploadControllerTest.http

@@ -1,7 +1,7 @@
 ### 上传文件
 POST {{ baseUrl }}/upload/uploadOneFile
 Content-Type: multipart/form-data; boundary=WebAppBoundary
-dl-token: 3814944677224469098
+dl-token: 4287073036899770894
 
 --WebAppBoundary
 Content-Disposition: form-data; name="file"; filename="RushE.mp3"