Index: binary-improvements2/WebServer/src/WebAPI/AbsRestApi.cs
===================================================================
--- binary-improvements2/WebServer/src/WebAPI/AbsRestApi.cs	(revision 418)
+++ binary-improvements2/WebServer/src/WebAPI/AbsRestApi.cs	(revision 426)
@@ -10,6 +10,4 @@
 		private static readonly UnityEngine.Profiling.CustomSampler jsonDeserializeSampler = UnityEngine.Profiling.CustomSampler.Create ("JSON_Deserialize");
 
-		protected readonly string[] CachedPerMethodModuleNames = new string[(int)ERequestMethod.Count];
-
 		protected AbsRestApi (string _name = null) : this(null, _name) {
 		}
@@ -19,16 +17,6 @@
 
 		protected override void RegisterPermissions () {
-			base.RegisterPermissions ();
-			
-			for (int i = 0; i < (int)ERequestMethod.Count; i++) {
-				ERequestMethod method = (ERequestMethod)i;
-
-				if (method is not (ERequestMethod.GET or ERequestMethod.PUT or ERequestMethod.POST or ERequestMethod.DELETE)) {
-					continue;
-				}
-
-				CachedPerMethodModuleNames [i] = $"webapi.{Name}:{method.ToStringCached ()}";
-				AdminWebModules.Instance.AddKnownModule (CachedPerMethodModuleNames [i], DefaultMethodPermissionLevel (method));
-			}
+			AdminWebModules.Instance.AddKnownModule (new AdminWebModules.WebModule (CachedApiModuleName, DefaultPermissionLevel (),
+				DefaultMethodPermissionLevels (), true));
 		}
 
@@ -136,39 +124,31 @@
 
 		public override bool Authorized (RequestContext _context) {
-			return ActiveMethodPermissionLevel (_context.Method) >= _context.PermissionLevel;
+			AdminWebModules.WebModule module = AdminWebModules.Instance.GetModule (CachedApiModuleName);
+
+			if (module.LevelPerMethod != null) {
+				int perMethodLevel = module.LevelPerMethod [(int)_context.Method];
+				if (perMethodLevel == AdminWebModules.MethodLevelNotSupported) {
+					return false;
+				}
+
+				if (perMethodLevel != AdminWebModules.MethodLevelInheritGlobal) {
+					return perMethodLevel >= _context.PermissionLevel;
+				}
+			}
+
+			return module.LevelGlobal >= _context.PermissionLevel;
 		}
 
 		/// <summary>
-		/// Define default permission levels per HTTP method
+		/// Define default permission levels per HTTP method as an array of levels. See <see cref="ERequestMethod"/> for the order of entries.
 		/// </summary>
-		/// <param name="_method">HTTP method to return the default value for</param>
-		/// <returns>Default permission level for the given HTTP method. A value of int.MinValue means no per-method default, use per-API default</returns>
-		public virtual int DefaultMethodPermissionLevel (ERequestMethod _method) => int.MinValue;
-
-		public virtual int ActiveMethodPermissionLevel (ERequestMethod _method) {
-			string methodApiModuleName = CachedPerMethodModuleNames [(int)_method];
-
-			if (methodApiModuleName == null) {
-				return 0;
-			}
-
-			AdminWebModules.WebModule? overrideModule = AdminWebModules.Instance.GetModule (methodApiModuleName, false);
-			if (overrideModule.HasValue) {
-				return overrideModule.Value.PermissionLevel;
-			}
-
-			overrideModule = AdminWebModules.Instance.GetModule (CachedApiModuleName, false);
-			if (overrideModule.HasValue) {
-				return overrideModule.Value.PermissionLevel;
-			}
-
-			int defaultMethodPermissionLevel = DefaultMethodPermissionLevel (_method);
-			// ReSharper disable once ConvertIfStatementToReturnStatement
-			if (defaultMethodPermissionLevel != int.MinValue) {
-				return defaultMethodPermissionLevel;
-			}
-
-			return DefaultPermissionLevel ();
-		}
+		/// <returns>Default permission levels for supported methods. See <see cref="AdminWebModules.MethodLevelNotSupported"/> and <see cref="AdminWebModules.MethodLevelInheritGlobal"/>.</returns>
+		public virtual int[] DefaultMethodPermissionLevels () => new[] {
+			AdminWebModules.MethodLevelNotSupported,
+			AdminWebModules.MethodLevelInheritGlobal,
+			AdminWebModules.MethodLevelInheritGlobal,
+			AdminWebModules.MethodLevelInheritGlobal,
+			AdminWebModules.MethodLevelInheritGlobal
+		};
 
 #region Helpers
