メインコンテンツにスキップ

Functions

マッチャーの関数

マッチャーに関数を指定して、より強力にすることもできます。 組み込み関数を使用するか、自分で関数を指定することができます。 組み込みのキーマッチング関数は次の形式を取ります:

bool function_name(string url, string pattern)

urlpatternと一致するかどうかを示すブール値を返します。

サポートされている組み込み関数は次のとおりです:

関数urlパターン
keyMatch/alice_data/resource1のようなURLパス/alice_data/*のようなURLパスまたは*パターンkeymatch_model.conf/keymatch_policy.csv
keyMatch2/alice_data/resource1のようなURLパス/alice_data/:resourceのようなURLパスまたは:パターンkeymatch2_model.conf/keymatch2_policy.csv
keyMatch3/alice_data/resource1のようなURLパス/alice_data/{resource}のようなURLパスまたは{}パターンhttps://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196
keyMatch4/alice_data/123/book/123のようなURLパス/alice_data/{id}/book/{id}のようなURLパスまたは{}パターンhttps://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222
keyMatch5/alice_data/123/?status=1のようなURLパス/alice_data/{id}/*のようなURLパス、{}または*パターンhttps://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526
regexMatch任意の文字列正規表現のパターンkeymatch_model.conf/keymatch_policy.csv
ipMatch192.168.2.123のようなIPアドレス192.168.2.0/24のようなIPアドレスまたはCIDRipmatch_model.conf/ipmatch_policy.csv
globMatch/alice_data/resource1のようなパス形式のパス/alice_data/*のようなglobパターンhttps://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466

キー取得関数については、通常3つのパラメータ(keyGetを除く)を取ります:

bool function_name(string url, string pattern, string key_name)

それらは、パターンに一致する場合にキーkey_nameの値を返し、何も一致しない場合は""を返します。

例えば、KeyGet2("/resource1/action", "/:res/action", "res")"resource1"を返し、KeyGet3("/resource1_admin/action", "/{res}_admin/*", "res")"resource1"を返します。 KeyGetについては、2つのパラメータを取るため、KeyGet("/resource1/action", "/*)"resource1/action"を返します。

関数urlパターンkey_name
keyGet/proj/resource1のようなURLパス/proj/*のようなURLパスまたは*パターン\keyget_model.conf/keymatch_policy.csv
keyGet2/proj/resource1のようなURLパス/prooj/:resourceのようなURLパスまたは:パターンパターンで指定されたキー名keyget2_model.conf/keymatch2_policy.csv
keyGet3「/proj/res3_admin/」のようなURLパス「/proj/{resource}_admin/*」のようなURLパスまたは「{}」パターンパターンで指定されたキー名https://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247

上記の関数の詳細はこちらでご覧いただけます:https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go

カスタマイズした関数の追加方法

まず、あなたの関数を準備します。 それはいくつかのパラメータを取り、boolを返します:

func KeyMatch(key1 string, key2 string) bool {
i := strings.Index(key2, "*")
if i == -1 {
return key1 == key2
}

if len(key1) > i {
return key1[:i] == key2[:i]
}
return key1 == key2[:i]
}

次に、それをinterface{}型でラップします:

func KeyMatchFunc(args ...interface{}) (interface{}, error) {
name1 := args[0].(string)
name2 := args[1].(string)

return (bool)(KeyMatch(name1, name2)), nil
}

最後に、関数をCasbinエンフォーサーに登録します:

e.AddFunction("my_func", KeyMatchFunc)

これで、あなたのモデルCONFでこのように関数を使用できます:

[matchers]
m = r.sub == p.sub && my_func(r.obj, p.obj) && r.act == p.act