跳转到主要内容

加载 Policy 子集

某些 adapter 支持过滤加载 policy:根据过滤器只从存储中加载一部分 policy。在大型或多租户场景中,加载全部 policy 并不现实,而这种做法可以降低内存占用并提升速度。

调用支持过滤的 adapter 的 LoadFilteredPolicy(filter)。过滤器的结构因 adapter 而异。使用过滤加载时,SavePolicy() 会被禁用,以免误将完整 policy 覆盖。

示例:结合带域的 RBAC 模型,使用带过滤功能的文件 adapter。该过滤器只加载 domain1 的 policy:

import (
"github.com/casbin/casbin/v3"
fileadapter "github.com/casbin/casbin/v3/persist/file-adapter"
)

enforcer, _ := casbin.NewEnforcer()

adapter := fileadapter.NewFilteredAdapter("examples/rbac_with_domains_policy.csv")
enforcer.InitWithAdapter("examples/rbac_with_domains_model.conf", adapter)

filter := &fileadapter.Filter{
P: []string{"", "domain1"},
G: []string{"", "", "domain1"},
}
enforcer.LoadFilteredPolicy(filter)

// Only policies for "domain1" are loaded.

LoadIncrementalFilteredPolicy(filter) 的用法与 LoadFilteredPolicy 类似,但它会把过滤后的 policy 追加到当前内存中的 policy 上,而不是替换。你可以把多次过滤加载(例如按租户分别加载)合并到一个 enforcer 中。