| local socket = require("socket") | |
| local Enforcer = require("src.main.Enforcer") | |
| local path = os.getenv("PWD") or io.popen("cd"):read() | |
| local function rawEnforce(sub, obj, act) | |
| local policy = {{"alice", "data1", "read"}, {"bob", "data2", "write"}} | |
| for _, rule in pairs(policy) do | |
| if rule[1] == sub and rule[2] == obj and rule[3] == act then | |
| return true | |
| end | |
| end | |
| return false | |
| end | |
| local function benchmarkRaw() | |
| local x = socket.gettime()*1000 | |
| for i = 1, 10000 do | |
| rawEnforce("alice", "data1", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 10000 | |
| end | |
| local function benchmarkBasicModel() | |
| local e = Enforcer:new(path .. "/examples/basic_model.conf", path .. "/examples/basic_policy.csv") | |
| e:enableLog(false) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 10000 do | |
| _ = e:enforce("alice", "data1", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 10000 | |
| end | |
| local function benchmarkRBACModel() | |
| local e = Enforcer:new(path .. "/examples/rbac_model.conf", path .. "/examples/rbac_policy.csv") | |
| e:enableLog(false) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 10000 do | |
| _ = e:enforce("alice", "data2", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 10000 | |
| end | |
| local function benchmarkRBACModelSmall() | |
| local e = Enforcer:new(path .. "/examples/rbac_model.conf", path .. "/examples/empty_policy.csv") | |
| e:enableLog(false) | |
| local pPolicies = {} | |
| -- 100 roles, 10 resources. | |
| for i = 1, 100 do | |
| table.insert(pPolicies, {"group"..tostring(i), "data"..tostring(i%10), "read"}) | |
| end | |
| e:AddPolicies(pPolicies) | |
| -- 1000 users. | |
| local gPolicies = {} | |
| for i = 1, 1000 do | |
| table.insert(gPolicies, {"user"..tostring(i), "group"..tostring(i%10)}) | |
| end | |
| e:AddGroupingPolicies(gPolicies) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 1000 do | |
| _ = e:enforce("user501", "data9", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 1000 | |
| end | |
| local function benchmarkRBACModelMedium() | |
| local e = Enforcer:new(path .. "/examples/rbac_model.conf", path .. "/examples/empty_policy.csv") | |
| e:enableLog(false) | |
| local pPolicies = {} | |
| -- 1000 roles, 100 resources. | |
| for i = 1, 1000 do | |
| table.insert(pPolicies, {"group"..tostring(i), "data"..tostring(i%100), "read"}) | |
| end | |
| e:AddPolicies(pPolicies) | |
| local gPolicies = {} | |
| -- 10000 users. | |
| for i = 1, 10000 do | |
| table.insert(gPolicies, {"user"..tostring(i), "group"..tostring(i%10)}) | |
| end | |
| e:AddGroupingPolicies(gPolicies) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 100 do | |
| _ = e:enforce("user5001", "data99", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 100 | |
| end | |
| local function benchmarkRBACModelLarge() | |
| local e = Enforcer:new(path .. "/examples/rbac_model.conf", path .. "/examples/empty_policy.csv") | |
| e:enableLog(false) | |
| local pPolicies = {} | |
| -- 10000 roles, 1000 resources. | |
| for i = 1, 10000 do | |
| table.insert(pPolicies, {"group"..tostring(i), "data"..tostring(i%1000), "read"}) | |
| end | |
| e:AddPolicies(pPolicies) | |
| local gPolicies = {} | |
| -- 100000 users. | |
| for i = 1, 100000 do | |
| table.insert(gPolicies, {"user"..tostring(i), "group"..tostring(i%10)}) | |
| end | |
| e:AddGroupingPolicies(gPolicies) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 10 do | |
| _ = e:enforce("user50001", "data999", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 10 | |
| end | |
| local function benchmarkRBACModelWithResourceRoles() | |
| local e = Enforcer:new(path .. "/examples/rbac_with_resource_roles_model.conf", path .. "/examples/rbac_with_resource_roles_policy.csv") | |
| e:enableLog(false) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 1000 do | |
| _ = e:enforce("alice", "data1", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 1000 | |
| end | |
| local function benchmarkRBACModelWithDomains() | |
| local e = Enforcer:new(path .. "/examples/rbac_with_domains_model.conf", path .. "/examples/rbac_with_domains_policy.csv") | |
| e:enableLog(false) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 1000 do | |
| _ = e:enforce("alice", "domain1", "data1", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 1000 | |
| end | |
| local function benchmarkABACModel() | |
| local e = Enforcer:new(path .. "/examples/abac_model.conf", path .. "/examples/empty_policy.csv") | |
| e:enableLog(false) | |
| local data1 = {["Name"] = "data1", ["Owner"] = "alice"} | |
| local x = socket.gettime()*1000 | |
| for i = 1, 1000 do | |
| _ = e:enforce("alice", data1, "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 1000 | |
| end | |
| local function benchmarkKeyMatchModel() | |
| local e = Enforcer:new(path .. "/examples/keymatch_model.conf", path .. "/examples/keymatch_policy.csv") | |
| e:enableLog(false) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 1000 do | |
| _ = e:enforce("alice", "/alice_data/resource1", "GET") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 1000 | |
| end | |
| local function benchmarkRBACModelWithDeny() | |
| local e = Enforcer:new(path .. "/examples/rbac_with_deny_model.conf", path .. "/examples/rbac_with_deny_policy.csv") | |
| e:enableLog(false) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 1000 do | |
| _ = e:enforce("alice", "data1", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 1000 | |
| end | |
| local function benchmarkPriorityModel() | |
| local e = Enforcer:new(path .. "/examples/priority_model.conf", path .. "/examples/priority_policy.csv") | |
| e:enableLog(false) | |
| local x = socket.gettime()*1000 | |
| for i = 1, 1000 do | |
| _ = e:enforce("alice", "data1", "read") | |
| end | |
| x = socket.gettime()*1000 - x | |
| return x, 1000 | |
| end | |
| local function runBenchmark() | |
| local t, o | |
| local time = {} | |
| local ops = {} | |
| local benchName = {} | |
| t, o = benchmarkRaw() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "Raw") | |
| t, o = benchmarkBasicModel() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "Basic Model") | |
| t, o = benchmarkRBACModel() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "RBAC Model") | |
| t, o = benchmarkRBACModelSmall() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "RBAC Model Small") | |
| t, o = benchmarkRBACModelMedium() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "RBAC Model Medium") | |
| t, o = benchmarkRBACModelLarge() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "RBAC Model Large") | |
| t, o = benchmarkRBACModelWithResourceRoles() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "RBAC Model with Resources") | |
| t, o = benchmarkRBACModelWithDomains() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "RBAC Model with Domains") | |
| t, o = benchmarkABACModel() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "ABAC Model") | |
| t, o = benchmarkKeyMatchModel() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "KeyMatch Model") | |
| t, o = benchmarkRBACModelWithDeny() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "RBAC Model with Deny") | |
| t, o = benchmarkPriorityModel() | |
| table.insert(time, t) | |
| table.insert(ops, o) | |
| table.insert(benchName, "Priority Model") | |
| print("Benchmark:") | |
| for k, v in pairs(benchName) do | |
| print(v .. ":", "\tTotal ops = " .. tostring(ops[k]), "\tTime per op = " .. string.format("%.4f ms", time[k]/ops[k])) | |
| end | |
| end | |
| runBenchmark() |