Bỏ qua tới nội dung
~nguyen-huu-trung
← Quay lại bài viết
2 phút đọc

Đừng viết ACL riêng cho agent

Khi trợ lý AI có quyền ghi dữ liệu, thứ đáng sợ không phải là mô hình nói sai mà là một lớp phân quyền thứ hai âm thầm lệch khỏi lớp thật.

  • Agentic AI
  • Security
  • Architecture

Khi thêm một trợ lý AI vào sản phẩm đã chạy thật, cám dỗ lớn nhất là dựng một lớp quyền riêng cho nó: một bảng cấu hình nhỏ liệt kê tool nào được gọi với vai trò nào. Việc đó làm rất nhanh, và sai rất lâu.

Vấn đề không nằm ở mô hình

Mô hình có thể gọi nhầm tool — điều đó xử lý được bằng schema chặt và cổng phê duyệt cho thao tác có tác dụng phụ. Rủi ro thật sự nằm ở chỗ khác: bạn vừa tạo ra hai bộ luật phân quyền cho cùng một tập dữ liệu.

Bộ thứ nhất phục vụ giao diện, được kiểm chứng mỗi ngày bởi người dùng thật. Bộ thứ hai phục vụ agent, chỉ được nhìn tới khi có sự cố. Vài tháng sau, một trường dữ liệu được đổi sang chế độ riêng tư ở bộ thứ nhất — và không ai nhớ phải sửa bộ thứ hai.

Cách tôi làm

Trong trợ lý AI Connector, mỗi tool gọi thẳng vào chính lớp permission và visibility mà giao diện đang dùng:

// Tool không tự quyết định ai được thấy gì.
// Nó hỏi đúng service mà UI hỏi, với đúng danh tính người dùng đang chat.
const contacts = await contactService.search(query, { actor: session.user });

Hệ quả rất dễ phát biểu, và cũng dễ kiểm chứng:

Khi lớp quyền thay đổi, agent thừa hưởng thay đổi đó ngay lập tức — không cần một migration riêng, không cần ai nhớ.

Cái giá phải trả

Cách này buộc bạn phải có sẵn một lớp quyền gọi được từ phía server, tách khỏi tầng HTTP. Nếu logic phân quyền đang nằm rải rác trong các route handler, bạn sẽ phải gom nó lại trước — và đó là công việc nên làm dù có agent hay không.

Đổi lại, phần khó nhất của việc đưa AI vào sản phẩm — trả lời câu hỏi "nó được phép đọc gì" — trở thành một câu hỏi đã có đáp án từ trước.