Prechádzať zdrojové kódy

基于二进制的权限判断

zh.sqy 9 rokov pred
rodič
commit
ac7abac652

+ 110 - 0
hsweb-web-core/src/main/java/org/hsweb/web/utils/AccessUtils.java

@@ -0,0 +1,110 @@
+package org.hsweb.web.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by 浩 on 2016-01-27 0027.
+ */
+public class AccessUtils {
+    private static String[] modules;
+    private static Map<String, Integer> moduleAccessInfo = new HashMap<>();
+
+    /**
+     * 给角色注册模块权限
+     *
+     * @param role    角色标识
+     * @param module  权限标识
+     * @param modules 同时注册多个模块权限
+     */
+    public static final void registerAccessRole(String role, String module, String... modules) {
+        Integer accessInfo = moduleAccessInfo.get(role);
+        if (accessInfo == null) accessInfo = 0;
+        int moduleIndex = indexOf(AccessUtils.modules, module);
+        if (moduleIndex == -1) return;
+        int access = (moduleIndex + 1) << 1;
+        accessInfo = accessInfo | access;
+        if (modules.length > 0) {
+            for (int i = 0; i < modules.length; i++) {
+                moduleIndex = indexOf(AccessUtils.modules, modules[i]);
+                if (moduleIndex == -1) continue;
+                access = (moduleIndex + 1) << 1;
+                accessInfo = accessInfo | access;
+            }
+        }
+        moduleAccessInfo.put(role, accessInfo);
+    }
+
+    /**
+     * 取消某个角色的权限信息
+     *
+     * @param role    角色标识
+     * @param module  权限标识
+     * @param modules 同时取消多个模块权限
+     */
+    public static final void cancelAccessRole(String role, String module, String... modules) {
+        Integer accessInfo = moduleAccessInfo.get(role);
+        if (accessInfo == null) accessInfo = 0;
+        int moduleIndex = indexOf(AccessUtils.modules, module);
+        if (moduleIndex == -1) return;
+        int access = (moduleIndex + 1) << 1;
+        accessInfo = accessInfo & (~access);
+        if (modules.length > 0) {
+            for (int i = 0; i < modules.length; i++) {
+                moduleIndex = indexOf(AccessUtils.modules, modules[i]);
+                if (moduleIndex == -1) continue;
+                access = (moduleIndex + 1) << 1;
+                accessInfo = accessInfo & (~access);
+            }
+        }
+        moduleAccessInfo.put(role, accessInfo);
+    }
+
+    /**
+     * 判断某个角色是否持有某个模块的权限
+     *
+     * @param role   角色
+     * @param module
+     * @return
+     */
+    public static final boolean roleAccessModule(String role, String module) {
+        Integer accessInfo = moduleAccessInfo.get(role);
+        if (accessInfo == null) return false;
+        int moduleIndex = indexOf(AccessUtils.modules, module);
+        if (moduleIndex == -1) return false;
+        int access = (moduleIndex + 1) << 1;
+        return (accessInfo & access) == access;
+    }
+
+    public static final void initModules(String... modules) {
+        AccessUtils.modules = modules;
+    }
+
+    private static final int indexOf(String[] arr, String str) {
+        for (int i = 0; i < arr.length; i++) {
+            if (arr[i].equals(str)) return i;
+        }
+        return -1;
+    }
+
+    public static void main(String[] args) {
+        initModules("admin", "test", "test1", "test2", "test3");
+
+        //给角色注册2个权限
+        registerAccessRole("hehe", "admin", "test");
+
+        System.out.println(roleAccessModule("hehe", "admin"));
+        System.out.println(roleAccessModule("hehe", "test"));
+        //注册test3权限
+        registerAccessRole("hehe", "test3");
+        System.out.println(roleAccessModule("hehe", "test3"));
+        //取消test3权限
+        cancelAccessRole("hehe", "test3");
+        System.out.println(roleAccessModule("hehe", "test3"));
+        //
+        System.out.println(roleAccessModule("hehe", "test2"));
+
+
+    }
+
+}