Bỏ qua đến nội dung chính

Functions

Các hàm trong các bộ so khớp

Bạn thậm chí có thể chỉ định các hàm trong một bộ so khớp để làm cho nó mạnh mẽ hơn. Bạn có thể sử dụng các hàm tích hợp sẵn hoặc chỉ định hàm của riêng bạn. Các hàm so khớp khóa tích hợp sẵn có định dạng như sau:

bool function_name(string url, string pattern)

Chúng trả về một giá trị boolean cho biết liệu url có khớp với pattern hay không.

Các hàm tích hợp sẵn được hỗ trợ là:

HàmurlpatternVí dụ
keyMatchmột đường dẫn URL như /alice_data/resource1một đường dẫn URL hoặc một mẫu * như /alice_data/*keymatch_model.conf/keymatch_policy.csv
keyMatch2một đường dẫn URL như /alice_data/resource1một đường dẫn URL hoặc một mẫu : như /alice_data/:resourcekeymatch2_model.conf/keymatch2_policy.csv
keyMatch3một đường dẫn URL như /alice_data/resource1một đường dẫn URL hoặc một mẫu {} như /alice_data/{resource}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L171-L196
keyMatch4một đường dẫn URL như /alice_data/123/book/123một đường dẫn URL hoặc một mẫu {} như /alice_data/{id}/book/{id}https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L208-L222
keyMatch5một đường dẫn URL như /alice_data/123/?status=1một đường dẫn URL, một mẫu {} hoặc * như /alice_data/{id}/*https://github.com/casbin/casbin/blob/1cde2646d10ad1190c0d784c3a1c0e1ace1b5bc9/util/builtin_operators_test.go#L485-L526
regexMatchbất kỳ chuỗi nàomột mẫu biểu thức chính quykeymatch_model.conf/keymatch_policy.csv
ipMatchmột địa chỉ IP như 192.168.2.123một địa chỉ IP hoặc một CIDR như 192.168.2.0/24ipmatch_model.conf/ipmatch_policy.csv
globMatchmột đường dẫn giống đường dẫn như /alice_data/resource1một mẫu glob như /alice_data/*https://github.com/casbin/casbin/blob/277c1a2b85698272f764d71a94d2595a8d425915/util/builtin_operators_test.go#L426-L466

Đối với các hàm lấy khóa, chúng thường nhận ba tham số (ngoại trừ keyGet):

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

Chúng sẽ trả về giá trị của khóa key_name nếu nó khớp với mẫu, và trả về "" nếu không có gì khớp.

Ví dụ, KeyGet2("/resource1/action", "/:res/action", "res") sẽ trả về "resource1", và KeyGet3("/resource1_admin/action", "/{res}_admin/*", "res") sẽ trả về "resource1". Đối với KeyGet, lấy hai tham số, KeyGet("/resource1/action", "/*) sẽ trả về "resource1/action".

Hàmurlmẫutên_khóaví dụ
keyGetmột đường dẫn URL như /proj/resource1một đường dẫn URL hoặc một mẫu * như /proj/*\keyget_model.conf/keymatch_policy.csv
keyGet2một đường dẫn URL như /proj/resource1một đường dẫn URL hoặc mẫu : như /prooj/:resourcetên khóa được chỉ định trong mẫukeyget2_model.conf/keymatch2_policy.csv
keyGet3một đường dẫn URL như /proj/res3_admin/một đường dẫn URL hoặc mẫu {} như /proj/{resource}_admin/*tên khóa được chỉ định trong mẫuhttps://github.com/casbin/casbin/blob/7bd496f94f5a2739a392d333a9aaaa10ae397673/util/builtin_operators_test.go#L209-L247

Xem chi tiết về các hàm trên tại: https://github.com/casbin/casbin/blob/master/util/builtin_operators_test.go

Cách thêm một hàm tùy chỉnh

Đầu tiên, chuẩn bị hàm của bạn. Nó nhận vào một số tham số và trả về một 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]
}

Sau đó, gói nó bằng các kiểu interface{}:

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

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

Cuối cùng, đăng ký hàm này vào enforcer của Casbin:

e.AddFunction("my_func", KeyMatchFunc)

Bây giờ, bạn có thể sử dụng hàm này trong tệp cấu hình mô hình CONF như thế này:

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