CX
5/8/2026
blog.summarize
blog.share_blog
API dùng để xem danh sách, xem chi tiết, tạo, cập nhật và xoá quy tắc bảo mật của một Object.
Mỗi quy tắc bảo mật xác định:
Tất cả request yêu cầu các header:
Authorization: Bearer {tokenId}-{secretToken}
Content-Type: application/jsonWorkspace được xác định từ access token. Không gửi workspace ID trong body hoặc một header riêng.
| Chức năng | Method | Endpoint |
|---|---|---|
| Xem danh sách quy tắc | POST |
/bapi/v1/object-security-rules/list |
| Xem chi tiết quy tắc | POST |
/bapi/v1/object-security-rules/view |
| Tạo quy tắc | POST |
/bapi/v1/object-security-rules |
| Tạo quy tắc (alias) | POST |
/bapi/v1/object-security-rules/create |
| Cập nhật một quy tắc | PUT |
/bapi/v1/object-security-rules/{ruleId} |
| Xoá quy tắc | POST |
/bapi/v1/object-security-rules/delete |
Mặc dù endpoint danh sách và chi tiết dùng POST, đây là các thao tác chỉ đọc.
Quy ước HTTP status:
| Trường hợp | HTTP status |
|---|---|
Tạo thành công (r = 0) |
201 |
Danh sách, chi tiết, cập nhật hoặc xoá thành công (r = 0) |
200 |
API trả lỗi nghiệp vụ (r != 0) |
400 |
| Body không phải JSON hợp lệ | 400 |
| Token không hợp lệ hoặc hết hạn | 401 |
| Vượt rate limit | 429 |
| Lỗi máy chủ | 500 |
r = 0mới là điều kiện thành công ở cấp nghiệp vụ. Khi xử lý lỗi, nên ghi log HTTP status,rvàmsg.
Trường type xác định mục đích của quy tắc và các quyền mà quy tắc chấp nhận.
type |
Mục đích | Điều kiện bản ghi | Loại đối tượng áp dụng | Nhóm quyền bắt buộc |
|---|---|---|---|---|
1 |
Quy định ai được tạo bản ghi và được nhập những field nào | Không sử dụng | 1 đến 5 |
create |
2 |
Quy định ai được xem, sửa hoặc xoá các bản ghi phù hợp | Bắt buộc | 1 đến 10 |
read, edit, delete |
Không thể đổi loại quy tắc sau khi tạo. Nếu cần cả quyền tạo và quyền trên bản ghi đã tồn tại, hãy tạo hai quy tắc riêng.
status: 1 = active, 0 = inactive.isStandard: 1 = quy tắc tiêu chuẩn, 0 = quy tắc tuỳ chỉnh.isStandard: 0.Quy tắc inactive vẫn được lưu nhưng không hoạt động. Dùng API cập nhật để kích hoạt hoặc vô hiệu hoá; thao tác xoá sẽ xoá vĩnh viễn quy tắc.
Request tạo và xoá dùng mảng data ở top-level:
{
"data": [
{ "...": "..." }
]
}Request tạo và xoá có thể chứa nhiều phần tử. Nếu bất kỳ phần tử nào lỗi, API sẽ trả lỗi cho request. Nên kiểm tra trạng thái hiện tại trước khi thử lại một batch bị lỗi.
Endpoint cập nhật public chỉ đại diện cho một quy tắc. Mảng data của request cập nhật phải chứa đúng một object.
| Trường | Kiểu | Mô tả |
|---|---|---|
id |
String | ID quy tắc được sinh tự động |
objectTypeId |
String | ID Object được quy tắc bảo vệ |
name |
String | Tên quy tắc, duy nhất trong Object; tối đa 100 ký tự |
description |
String/null | Mô tả không bắt buộc; tối đa 500 ký tự |
status |
Integer | 1 active, 0 inactive |
type |
Integer | Mục đích: 1 quyền tạo, 2 quyền xem/sửa/xoá |
isStandard |
Integer | 1 tiêu chuẩn, 0 tuỳ chỉnh |
filter |
Object/null | Điều kiện chọn bản ghi cho quy tắc type=2 |
personnelFilters |
Array | Điều kiện xác định những người dùng được áp dụng quy tắc |
scopes |
Array | Quyền thao tác và phạm vi field được cấp |
created |
Long | Thời điểm tạo, Unix milliseconds |
updated |
Long | Thời điểm cập nhật gần nhất, Unix milliseconds |
createdBy |
Object/null | Thông tin rút gọn của người tạo, thường có id, fullName và avatar |
updatedBy |
Object/null | Thông tin rút gọn của người cập nhật gần nhất |
Response dạng rút gọn thường trả filter: null, personnelFilters và scopes là mảng rỗng. Dùng endpoint chi tiết hoặc gửi withDetails: true khi xem danh sách nếu cần các thông tin này.
Object filter chỉ áp dụng cho quy tắc type=2. Bản ghi phải thoả mãn điều kiện này trước khi quy tắc có thể cấp quyền xem, sửa hoặc xoá.
{
"logicType": "AND",
"logic": "",
"conditions": [
{
"field": "gross_profit_amount",
"op": ">",
"params": 10
}
]
}| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
logicType |
String | Có | Cách kết hợp điều kiện, thường là AND hoặc OR |
logic |
String | Không | Biểu thức đánh số cho logic nâng cao, ví dụ 1 AND (2 OR 3); dùng "" khi logicType đã đủ |
conditions |
Array | Có | Danh sách điều kiện bản ghi. Dùng [] khi không giới hạn theo field cụ thể |
conditions[].field |
String | Có | Slug của field, không phải field ID |
conditions[].op |
String | Có | Toán tử so sánh được loại field hỗ trợ |
conditions[].params |
Bất kỳ | Tuỳ toán tử | Giá trị so sánh; có thể là một giá trị, mảng hoặc null |
Các toán tử thường dùng gồm =, !=, >, >=, <, <=, in, not in, is null và not null. Toán tử hợp lệ và cấu trúc params phụ thuộc loại field.
Với quy tắc type=1, bỏ filter; quyền tạo được xác định bởi personnelFilters và scope create.
personnelFilters)Mỗi phần tử chọn một nhóm người dùng. Nhiều phần tử sẽ hợp nhất các nhóm người dùng được chọn.
op |
Ý nghĩa |
|---|---|
all |
Tất cả người dùng trong nhóm; bỏ ID phần tử của nhóm ở các trường hợp được ghi chú |
include |
Chỉ người dùng, vai trò, vị trí, phòng ban hoặc người dùng suy ra từ field được chọn |
exclude |
Tất cả trong nhóm ngoại trừ các phần tử được chọn |
Các phần tử cùng một loại điều kiện phải dùng cùng op. Riêng điều kiện phòng ban (type 2 và 3) có thể dùng op khác nhau theo từng phòng ban.
type |
Chọn người dùng theo | Trường bắt buộc | op hỗ trợ |
Loại quy tắc |
|---|---|---|---|---|
1 |
Người dùng cụ thể | personnelId, trừ khi op=all |
all, include, exclude |
1, 2 |
2 |
Vị trí trong một phòng ban | departmentId; thêm positionId khi op=include |
all, include |
1, 2 |
3 |
Vị trí trong một phòng ban và các phòng ban cấp dưới | departmentId; thêm positionId khi op=include |
all, include |
1, 2 |
4 |
Vai trò | roleId, trừ khi op=all |
all, include, exclude |
1, 2 |
5 |
Vị trí trong toàn bộ tổ chức | positionId, trừ khi op=all |
all, include, exclude |
1, 2 |
6 |
Người dùng được tham chiếu bởi một field tra cứu Nhân sự trên bản ghi | fieldId |
include |
2 |
7 |
Người dùng cùng phòng ban với nhân sự được tham chiếu, đồng thời giữ vị trí được chọn | fieldId, positionId |
include |
2 |
8 |
Người dùng thuộc phòng ban cha của nhân sự được tham chiếu, đồng thời giữ vị trí được chọn | fieldId, positionId |
include |
2 |
9 |
Người dùng thuộc phòng ban được tham chiếu bởi field tra cứu Phòng ban, đồng thời giữ vị trí được chọn | fieldId, positionId |
include |
2 |
10 |
Người dùng thuộc phòng ban cha của phòng ban được tham chiếu, đồng thời giữ vị trí được chọn | fieldId, positionId |
include |
2 |
Với type 6 đến 10, fieldId là ID của field. Field phải thuộc Object được bảo vệ và phải tra cứu đúng Object Nhân sự hoặc Phòng ban theo yêu cầu.
Ví dụ:
[
{
"type": 1,
"op": "all"
},
{
"type": 3,
"op": "include",
"departmentId": "DEPKG4QQZEKMRN",
"positionId": "POSKG4QQHEKMN9"
},
{
"type": 4,
"op": "include",
"roleId": "RO87GAQEIKN10"
}
]Nên gửi ít nhất một điều kiện có ý nghĩa. Với include hoặc exclude, gửi một phần tử trong mảng cho mỗi ID được chọn.
scopes)scope |
Ý nghĩa | op hỗ trợ |
|---|---|---|
create |
Các field người dùng được nhập khi tạo bản ghi | all, include, exclude |
read |
Các field người dùng được xem trên bản ghi phù hợp | all, include, exclude, none |
edit |
Các field người dùng được sửa trên bản ghi phù hợp | all, include, exclude, none |
delete |
Người dùng có được xoá bản ghi phù hợp hay không | yes, no |
Với include hoặc exclude, thêm một phần tử cho mỗi field và dùng fieldId:
[
{
"scope": "edit",
"op": "include",
"fieldId": "OF87GAQEIKN10"
},
{
"scope": "edit",
"op": "include",
"fieldId": "OF87GAQEIKN11"
}
]Tất cả phần tử của cùng một scope phải dùng cùng op.
all, none, yes hoặc no, không gửi fieldId.type=1 chỉ được chứa scope create.type=2 phải chứa đủ read, edit và delete. Dùng none hoặc no khi không cấp một quyền.type=2, phải còn ít nhất một field được xem hoặc được sửa.create hoặc edit.Endpoint: POST /bapi/v1/object-security-rules/list
{
"objectTypeId": "OT87GAQEIKN10",
"status": "1",
"order": "updated",
"sort": "desc"
}| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id |
String | Không | ID quy tắc chính xác hoặc nhiều ID phân cách bằng dấu phẩy |
objectTypeId |
String | Không* | Object ID hoặc nhiều Object ID phân cách bằng dấu phẩy |
objectSlug |
String | Không* | Object slug hoặc nhiều slug phân cách bằng dấu phẩy; được chuyển thành Object ID |
name |
String | Không | Tìm một phần tên; nhiều giá trị phân cách bằng dấu phẩy được hiểu là các lựa chọn thay thế |
description |
String | Không | Tìm một phần mô tả; nhiều giá trị phân cách bằng dấu phẩy được hiểu là các lựa chọn thay thế |
status |
Integer/String | Không | 0 inactive hoặc 1 active; hỗ trợ nhiều giá trị phân cách bằng dấu phẩy |
isStandard |
Integer/String | Không | 0 tuỳ chỉnh hoặc 1 tiêu chuẩn; hỗ trợ nhiều giá trị phân cách bằng dấu phẩy |
createdBy |
String | Không | ID người tạo hoặc nhiều ID phân cách bằng dấu phẩy |
updatedBy |
String | Không | ID người cập nhật gần nhất hoặc nhiều ID phân cách bằng dấu phẩy |
created |
String | Không | Khoảng thời gian milliseconds: start,end, start, hoặc ,end |
updated |
String | Không | Khoảng thời gian cập nhật milliseconds: start,end, start, hoặc ,end |
filterFieldsNotIn |
String | Không | Tên các field có điều kiện khớp chính xác cần đảo ngược, phân cách bằng dấu phẩy; ví dụ createdBy,status |
withDetails |
Boolean | Không | true trả thêm filter, personnelFilters và scopes; mặc định false |
order |
String | Không | Field sắp xếp như updated, created, name, status, isStandard hoặc type; mặc định created |
sort |
String | Không | Chiều sắp xếp asc hoặc desc; mặc định desc |
*Với request danh sách thông thường, nên gửi objectTypeId hoặc objectSlug để chỉ lấy quy tắc của Object mong muốn.
Endpoint hiện trả toàn bộ quy tắc phù hợp và chưa phân trang.
curl --location 'https://{workspace-domain}/bapi/v1/object-security-rules/list' \
--header 'Authorization: Bearer {tokenId}-{secretToken}' \
--header 'Content-Type: application/json' \
--data '{
"objectTypeId": "OT87GAQEIKN10",
"status": "1",
"order": "updated",
"sort": "desc"
}'{
"r": 0,
"msg": "Success",
"data": [
{
"id": "OSKDELQESKMSD",
"objectTypeId": "OT87GAQEIKN10",
"name": "Quyền truy cập đơn hàng giá trị cao",
"description": "Cho phép người dùng được chọn xử lý đơn hàng giá trị cao",
"status": 1,
"type": 2,
"isStandard": 0,
"filter": null,
"personnelFilters": [],
"scopes": [],
"created": 1785916800000,
"updated": 1786003200000,
"createdBy": {
"id": "PE87GAQEIKN10",
"fullName": "Nguyễn Văn An"
},
"updatedBy": {
"id": "PE87GAQEIKN10",
"fullName": "Nguyễn Văn An"
}
}
]
}Endpoint: POST /bapi/v1/object-security-rules/view
{
"id": "OSKDELQESKMSD"
}| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
id |
String | Có | ID quy tắc |
Endpoint luôn yêu cầu dữ liệu chi tiết đầy đủ của quy tắc.
curl --location 'https://{workspace-domain}/bapi/v1/object-security-rules/view' \
--header 'Authorization: Bearer {tokenId}-{secretToken}' \
--header 'Content-Type: application/json' \
--data '{
"id": "OSKDELQESKMSD"
}'Response dùng dạng mảng. Đọc quy tắc cần tìm tại data[0].
{
"r": 0,
"msg": "Success",
"data": [
{
"id": "OSKDELQESKMSD",
"objectTypeId": "OT87GAQEIKN10",
"name": "Quyền truy cập đơn hàng giá trị cao",
"description": "Cho phép người dùng được chọn xử lý đơn hàng giá trị cao",
"status": 1,
"type": 2,
"isStandard": 0,
"filter": {
"id": "FIvJ0SPEQaoAk",
"logicType": "AND",
"logic": "",
"conditions": [
{
"field": "gross_profit_amount",
"op": ">",
"params": 10
}
],
"objectTypeId": "OT87GAQEIKN10",
"objectTypeSlug": "order"
},
"personnelFilters": [
{
"id": "PFLQESKMSD001",
"type": 1,
"op": "all"
}
],
"scopes": [
{
"id": "OSSLQESKMSD01",
"scope": "read",
"op": "all"
},
{
"id": "OSSLQESKMSD02",
"scope": "edit",
"op": "include",
"fieldId": "OF87GAQEIKN10"
},
{
"id": "OSSLQESKMSD03",
"scope": "delete",
"op": "no"
}
],
"created": 1785916800000,
"updated": 1786003200000
}
]
}Nếu không tìm thấy ID, request vẫn thành công với data: [].
Endpoint: POST /bapi/v1/object-security-rules
Alias tương đương: POST /bapi/v1/object-security-rules/create.
| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
objectTypeId |
String | Có | ID Object được quy tắc bảo vệ |
name |
String | Có | Tên quy tắc duy nhất trong Object; tối đa 100 ký tự |
description |
String/null | Không | Mô tả; tối đa 500 ký tự |
status |
Integer | Có | 1 active hoặc 0 inactive |
type |
Integer | Có | 1 quyền tạo hoặc 2 quyền xem/sửa/xoá |
isStandard |
Integer | Có | Phải là 0 với quy tắc tuỳ chỉnh được tạo qua API này |
filter |
Object | Với type=2 |
Điều kiện chọn các bản ghi được quy tắc bảo vệ |
personnelFilters |
Array | Có | Người dùng được áp dụng quy tắc |
scopes |
Array | Có | Các quyền được quy tắc cấp |
Mỗi Object có tối đa 50 quy tắc bảo mật. Tên quy tắc phải duy nhất trong Object đó.
curl --location 'https://{workspace-domain}/bapi/v1/object-security-rules' \
--header 'Authorization: Bearer {tokenId}-{secretToken}' \
--header 'Content-Type: application/json' \
--data '{
"data": [
{
"objectTypeId": "OT87GAQEIKN10",
"isStandard": 0,
"name": "Quyền truy cập đơn hàng giá trị cao",
"description": "Cho phép người dùng được chọn xử lý đơn hàng giá trị cao",
"filter": {
"logicType": "AND",
"logic": "",
"conditions": [
{
"field": "gross_profit_amount",
"op": ">",
"params": 10
}
]
},
"status": 1,
"scopes": [
{
"scope": "read",
"op": "all"
},
{
"scope": "edit",
"op": "include",
"fieldId": "OF87GAQEIKN10"
},
{
"scope": "delete",
"op": "no"
}
],
"personnelFilters": [
{
"op": "all",
"type": 1
}
],
"type": 2
}
]
}'curl --location 'https://{workspace-domain}/bapi/v1/object-security-rules' \
--header 'Authorization: Bearer {tokenId}-{secretToken}' \
--header 'Content-Type: application/json' \
--data '{
"data": [
{
"objectTypeId": "OT87GAQEIKN10",
"isStandard": 0,
"name": "Tạo đơn hàng trong phòng Kinh doanh",
"description": "Quản lý Kinh doanh được tạo đơn hàng",
"status": 1,
"scopes": [
{
"scope": "create",
"op": "all"
}
],
"personnelFilters": [
{
"departmentId": "DEPKG4QQZEKMRN",
"positionId": "POSKG4QQHEKMN9",
"op": "include",
"type": 3
}
],
"type": 1
}
]
}'data chứa một ID được sinh cho mỗi quy tắc đã tạo, theo đúng thứ tự request.
{
"r": 0,
"msg": "OK",
"data": [
{
"id": "OSKDELQESKMSD"
}
]
}Endpoint: PUT /bapi/v1/object-security-rules/{ruleId}
ruleId trên URL là nguồn tin cậy. API đặt data[0].id theo URL ngay cả khi body chứa một ID khác.
Mảng data phải chứa đúng một object.
name, description và status hỗ trợ partial update. Field không gửi sẽ giữ nguyên giá trị hiện tại.objectTypeId, type và isStandard; không gửi các field này trong request cập nhật.filter, điều kiện bản ghi hiện tại được giữ nguyên. Nếu gửi, hãy gửi cấu hình filter đầy đủ mong muốn.personnelFilters, các điều kiện người dùng hiện tại được giữ nguyên. Nếu gửi, mảng trở thành toàn bộ tập điều kiện mong muốn; phần tử cũ không có trong mảng sẽ bị xoá.scopes, các quyền hiện tại được giữ nguyên. Nếu gửi, mảng trở thành toàn bộ tập quyền mong muốn; phần tử cũ không có trong mảng sẽ bị xoá.personnelFilters: [] hoặc scopes: [] sẽ xoá các phần tử hiện tại và có thể làm quy tắc không còn hiệu lực. Nên gửi một cấu hình đầy đủ, hợp lệ.curl --location --request PUT \
'https://{workspace-domain}/bapi/v1/object-security-rules/OSKDELQESKMSD' \
--header 'Authorization: Bearer {tokenId}-{secretToken}' \
--header 'Content-Type: application/json' \
--data '{
"data": [
{
"status": 0
}
]
}'curl --location --request PUT \
'https://{workspace-domain}/bapi/v1/object-security-rules/OSKDELQESKMSD' \
--header 'Authorization: Bearer {tokenId}-{secretToken}' \
--header 'Content-Type: application/json' \
--data '{
"data": [
{
"name": "Quyền truy cập đơn hàng giá trị cao - cập nhật",
"description": "Chỉ quản lý Kinh doanh được sửa các field đã chọn",
"filter": {
"logicType": "AND",
"logic": "",
"conditions": [
{
"field": "gross_profit_amount",
"op": ">",
"params": 20
}
]
},
"status": 1,
"scopes": [
{
"scope": "read",
"op": "all"
},
{
"scope": "edit",
"op": "include",
"fieldId": "OF87GAQEIKN10"
},
{
"scope": "delete",
"op": "no"
}
],
"personnelFilters": [
{
"roleId": "RO87GAQEIKN10",
"op": "include",
"type": 4
}
]
}
]
}'{
"r": 0,
"msg": "OK"
}Gọi endpoint chi tiết sau khi cập nhật nếu client cần trạng thái đầy đủ đã được lưu.
Endpoint: POST /bapi/v1/object-security-rules/delete
Thao tác xoá là vĩnh viễn. Nếu chỉ muốn tạm dừng quy tắc, hãy cập nhật status thành 0.
{
"data": [
{
"id": "OSI2YLQ6GQ7KQ"
},
{
"id": "OSI2YLQ67Q7JL"
}
]
}| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
data |
Array | Có | Danh sách quy tắc cần xoá |
data[].id |
String | Có | ID quy tắc |
curl --location 'https://{workspace-domain}/bapi/v1/object-security-rules/delete' \
--header 'Authorization: Bearer {tokenId}-{secretToken}' \
--header 'Content-Type: application/json' \
--data '{
"data": [
{
"id": "OSI2YLQ6GQ7KQ"
},
{
"id": "OSI2YLQ67Q7JL"
}
]
}'{
"r": 0,
"msg": "OK"
}r |
Mô tả |
|---|---|
400 |
Thiếu hoặc sai objectTypeId |
402 |
Thiếu hoặc sai ID field tra cứu trong điều kiện người dùng |
405 |
Thiếu hoặc sai ID quy tắc |
406 |
Thiếu hoặc sai điều kiện bản ghi |
407 |
Tên quy tắc không hợp lệ hoặc trùng trong Object |
408 |
Cấu hình đối tượng áp dụng không hợp lệ |
409 |
Cấu hình scope không hợp lệ hoặc không đầy đủ |
410 |
Toán tử scope không hợp lệ |
411 |
Toán tử của điều kiện người dùng không hợp lệ |
412 |
Tổ hợp scope xem/sửa không hợp lệ |
413 |
Giá trị status hoặc isStandard không hợp lệ |
414 |
Không thể tạo hoặc gán quy tắc tiêu chuẩn qua API này |
415 |
type quy tắc không hợp lệ |
420 |
Chiều sắp xếp không hợp lệ |
424 |
Trùng điều kiện người dùng |
425 |
Trùng phần tử scope |
428 |
Thiếu personnel ID |
429 |
Thiếu department ID |
430 |
Thiếu position hoặc role ID |
434 |
Mô tả dài hơn 500 ký tự |
501 |
Không tìm thấy quy tắc |
504 |
Không tìm thấy field được điều kiện hoặc scope tham chiếu |
506 |
Không tìm thấy Object |
524 |
Object đã đạt giới hạn 50 quy tắc bảo mật |
525 |
Không tìm thấy nhân sự |
526 |
Không tìm thấy phòng ban |
527 |
Không tìm thấy vị trí hoặc vai trò |
528 |
Object này không cho phép tạo quy tắc bảo mật tuỳ chỉnh |
600 |
Không xử lý được điều kiện bản ghi |
700 |
Lỗi máy chủ |
Ví dụ:
{
"r": 407,
"msg": "Duplicate name: Quyền truy cập đơn hàng giá trị cao"
}personnelFilters hoặc scopes, nhất là khi nhiều client có thể cùng chỉnh sửa một quy tắc.status: 0 để vô hiệu hoá có thể khôi phục. Endpoint xoá không hỗ trợ khôi phục quy tắc.type=1) và quy tắc quyền trên bản ghi đã tồn tại (type=2).blog.blogs_related
Bắt đầu đổi mới phương thức vận hành và tự chủ hệ thống quản trị công việc của bạn
CÔNG TY CỔ PHẦN STRINGEE
Văn phòng