So sánh Cancancan và Pundit
Bài đăng này đã không được cập nhật trong 8 năm
Hiện nay, có khá nhiều cách để bạn phân quyền cho user khi ứng dụng của bạn có nhiều role. Có 2 biện pháp hiện đang được sử dụng rộng rãi là: Cancancan
và Pundit
. Nếu bạn băn khoăn không biết nên chọn cách nào thì bài viết sau đây sẽ là một gợi ý cho bạn trong việc chọn lựa.
Pundit gem
Pundit
là một hệ thống các authorization sử dụng để cấp quyền cho các đối tượng trong Ruby sử dụng thư mục app/policies/
để implement các rule.
Pundit
phù hợp với các kiến trúc hướng dịch vụ vì thế nó phù hợp với các ứng dụng Rails có quy mô lớn, chú trọng tới thiết kế theo hướng đối tượng trong các object được cung cấp các dịch vụ riêng.
Đối tượng được cấp quyền trong Pundit được mô tả như một POROs hoặc được gọi là “plain old Ruby objects” . PORO được hiểu đơn giản như là một đối tượng trong policy của Pundit không kế thừa từ các class khác, hoặc include code từ nơi khác. Ngược lại, một mô hình Rails được kế thừa từ Active Record không phải là một PORO - một mô hình kế thừa các hành vi từ class cha.
Cancancan
Cancancan
là một gem phổ biến để authorization được phát triển bởi Ryan Bates (được biết đến nhiều nhất trong Rails cast) và không được phát triển nhiều khi bắt đầu release Rails 4. Do sự phổ biến của nó nên các dự án Cancancan dựa vào sự phát triển của người dùng để tự update cho chính nó. Cancancan cung cấp một DSL(ngôn ngữ miền cụ thể) cô lập tất cả các logic cho phép một class Ability duy nhất.
Cancancan or Pundit?
Khi ứng dụng của bạn khá phức tạp, các lớp Ability trong Cancancan có thể khó để phát triển được. Ngoài ra, mọi yêu cầu authorization cần được sự đánh giá của các lớp Cancancan Ability. Vì điều này, Cancancan được các Rails developers thường xuyên sử dụng. Khi bạn phát triển tiếp một project sử dụng Cancancan thì hãy nâng cấp nó lên để phân chia quyền cho chính xác.
Pundit cũng cung cấp khả năng tách biệt quyền của một user đối với một object trong controller và view. Với Pundit, đối tượng được tập trung nhất không phải là một file Ability đơn lẻ. Thay vào đó, Pundit sử dụng một forder app/policies/
chứa các object để phân quyền truy cập. Thêm authorization cho một action trong controller của một đối tượng cần tới sự cho phép của một helper method trong app/policies
. Pundit sử dụng kỹ thuật meta-programing để tạo một policy cho một object phù hợp với quy tắc truy cập vào action trong controller. Đối tượng được policy trong pundit rất chi tiết, thường sẽ không cần trải qua những yêu cầu về logic nhiều như Cancancan. Bạn có thể tạo một object để policy trong Pundit bất kì khi nào bạn muốn để sử dụng với một controller. Thông thường, bạn sẽ tạo ra một object trong policy tương ứng với một model cụ thể(Ví dụ như bạn sẽ tạo ra một UsersPolicy tương ứng với model User) và sẽ sử dụng policy để kiểm soát các hành động trong controller hoặc view cụ thể(ví dụ trong UsersController và view của User).
Khi phân quyền khá phức tạp, và một object chỉ có quyền với một vài attribute cụ thể(vì dụ: User chỉ được sửa thông tin của chính mình như name, age, ... mà không được set quyền cho mình thành admin) thì mình thường hay sử dụng Pundit.
Với những ứng dụng đơn giản hơn, một object có tất cả các quyền thuộc về cục bộ thì mình sẽ sử dụng Cancancan
Kết luận
Mong rằng với bài viết này, các bạn có thể có chọn lựa đúng đắn khi phân quyền cho ứng dụng của mình!
Xin cảm ơn!
All rights reserved