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àm | url | pattern | Ví dụ |
---|---|---|---|
keyMatch | một đường dẫn URL như /alice_data/resource1 | một đường dẫn URL hoặc một mẫu * như /alice_data/* | keymatch_model.conf/keymatch_policy.csv |
keyMatch2 | một đường dẫn URL như /alice_data/resource1 | một đường dẫn URL hoặc một mẫu : như /alice_data/:resource | keymatch2_model.conf/keymatch2_policy.csv |
keyMatch3 | một đường dẫn URL như /alice_data/resource1 | mộ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 |
keyMatch4 | một đường dẫn URL như /alice_data/123/book/123 | mộ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 |
keyMatch5 | một đường dẫn URL như /alice_data/123/?status=1 | mộ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 |
regexMatch | bất kỳ chuỗi nào | một mẫu biểu thức chính quy | keymatch_model.conf/keymatch_policy.csv |
ipMatch | một địa chỉ IP như 192.168.2.123 | một địa chỉ IP hoặc một CIDR như 192.168.2.0/24 | ipmatch_model.conf/ipmatch_policy.csv |
globMatch | một đường dẫn giống đường dẫn như /alice_data/resource1 | mộ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àm | url | mẫu | tên_khóa | ví dụ |
---|---|---|---|---|
keyGet | một đường dẫn URL như /proj/resource1 | một đường dẫn URL hoặc một mẫu * như /proj/* | \ | keyget_model.conf/keymatch_policy.csv |
keyGet2 | một đường dẫn URL như /proj/resource1 | một đường dẫn URL hoặc mẫu : như /prooj/:resource | tên khóa được chỉ định trong mẫu | keyget2_model.conf/keymatch2_policy.csv |
keyGet3 | mộ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ẫu | https://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