2008-11-10 26 views
5

Tôi đang làm việc trên ứng dụng web Rails và hiện đang được một số 20 người dùng sử dụng.Cách tốt nhất để thực hiện ủy quyền chi tiết cho một ứng dụng web là gì?

Một số phần của ứng dụng chỉ có thể truy cập được bởi một số người dùng, vì vậy chúng tôi đã có khung ủy quyền cơ bản tại chỗ, mà tôi đã triển khai bằng plugin actions_as_authenticated.

Đặc quyền của người dùng tùy thuộc vào bộ phận họ làm việc, ví dụ quản trị có quyền truy cập vào tất cả các phần của ứng dụng, trong khi kế toán chỉ có quyền truy cập vào các phần liên quan đến kế toán. các bộ phận, vv ..

Mặt khác, người dùng sẽ thấy các liên kết đến các hành động mà họ không có đủ đặc quyền. Ví dụ, những người trong bộ phận bán hàng nhìn thấy một liên kết đến các hồ sơ tài chính trong menu chính, nhưng khi họ nhấp vào nó, không có gì xảy ra. Điều này là do AFAIK không có cách hiệu quả để truy vấn các đặc quyền của người dùng bằng cách sử dụng behavior_as_authenticated.

Tôi muốn thay đổi điều này bằng hai cách:

  1. tôi muốn giới thiệu nhiều uỷ quyền hạt mịn. Hiện tại, việc cấp phép được thực hiện ở cấp độ bộ điều khiển. Tôi muốn làm điều này ở cấp độ hành động hoặc mô hình. Ví dụ, tôi muốn những người trong bộ phận bán hàng có thể tạo và cập nhật các khoản thanh toán, nhưng không xóa chúng.

  2. Tôi muốn có thể truy vấn các đặc quyền của người dùng một cách hiệu quả, vì vậy tôi có thể xóa các liên kết không cần thiết (và khó hiểu) khỏi giao diện.

Bạn nghĩ cách nào là cách thanh lịch nhất để triển khai tính năng này?

Câu trả lời dành riêng cho đường ray là không cần thiết, tôi chỉ muốn biết cách thực hiện điều này trong ứng dụng hướng dữ liệu.

Cuối cùng, dưới đây là cách nó hiện đang thực hiện:

def authorized? 
    current_user.role.foo? or current_user.role.bar? 
end 

Và đây là ý tưởng ban đầu của tôi, mà tôi nghĩ không phải là cách tốt nhất để giải quyết việc này:

 
+------------+------------+---------+ 
| department | controller | action | 
+------------+------------+---------+ 
| accounting | payments | index | 
| accounting | payments | new  | 
| accounting | payments | create | 
| accounting | payments | edit | 
| accounting | payments | update | 
| accounting | payments | destroy | 
| sales  | payments | new  | 
| sales  | payments | create | 
| sales  | payments | edit | 
| sales  | payments | update | 
+------------+------------+---------+ 

hoặc

 
+------------+----------+-------+--------+------+--------+--------+ 
| department | model | list | create | read | update | delete | 
+------------+----------+-------+--------+------+--------+--------+ 
| accounting | payments | TRUE | TRUE | TRUE | TRUE | TRUE | 
| sales  | payments | FALSE | TRUE | TRUE | TRUE | FALSE | 
+------------+----------+-------+--------+------+--------+--------+ 

Trả lời

3

Khái niệm cơ bản về ủy quyền, như tôi hiểu, là một vai trò. Vai trò có thể bày tỏ những điều khác nhau:

  1. mối quan hệ của một người dùng vào hệ thống như một toàn thể
  2. mối quan hệ của một người sử dụng một số loại thực thể (ví dụ như để (ví dụ như là một admin của hệ thống.). làm người kiểm duyệt nhận xét)
  3. mối quan hệ của người dùng với một số thực thể cụ thể (ví dụ: làm chủ sở hữu của một số tài nguyên)
  4. một số mối quan hệ phức tạp khác (ví dụ: làm bạn của người dùng là chủ sở hữu một số tài nguyên)
  5. người dùng đó có một số thuộc tính hoặc phản hồi một số thông báo trong một số phần tử r cách (ví dụ: là một thiếu niên)

Hệ thống ủy quyền chi tiết thực sự tốt sẽ cho phép bạn xác định vai trò cho người dùng dựa trên bất kỳ tiêu chí nào được đề cập ở trên. Hơn nữa, nó sẽ cho phép bạn thiết lập nhiều hơn một vai trò cho người dùng. (Các dạng trình cắm ủy quyền đơn giản nhất cho Rails thường cho phép bạn xác định loại vai trò đầu tiên và chỉ đặt một vai trò cho người dùng.)

Phần khác của tác giả là cơ chế quyết định mã nào sẽ chạy (hoặc không chạy) dựa trên thực tế nếu người dùng phù hợp với vai trò nào đó (bộ vai trò) hay không. Để áp dụng cơ chế này, chúng ta phải tìm các điểm nơi ủy quyền sẽ diễn ra và chọn các vai trò mà mã nên hoặc không nên chạy. Cách thức hoạt động cho tôi trong Rails là xác định vai trò ở cấp mô hình và để lại cơ chế cấp phép (thiết lập vai trò được phép cho các phần mã mà tôi muốn được ủy quyền và hỏi xem người dùng hiện tại có vai trò được cho phép hay không để chạy một phần) hoàn toàn cho bộ điều khiển/lượt xem.

Đối với điều này, tôi sử dụng plugin được phép chỉnh sửa có tất cả các khả năng mà tôi vừa đề cập được xây dựng ngay (các loại vai trò khác nhau, nhiều vai trò cho một người dùng, ủy quyền trên bộ điều khiển và cấp chế độ xem).

0

bạn có thể cần phải giới thiệu khái niệm 'điểm chức năng' hoặc 'các tính năng' vào mô hình của bạn làm điểm kiểm soát cho acc ess; một 'tính năng' có thể có 'tính năng cha mẹ' tùy chọn để tạo thành một hệ thống phân cấp. Bạn có thể quyết định những gì là và không phải là một tính năng, và kiểm tra các quyền theo chương trình. Điều này cũng sẽ cho phép bạn kiểm tra quyền truy cập cấp tính năng trước khi vẽ một menu để người dùng không bao giờ thấy liên kết đến các trang mà họ không được phép truy cập.

một tình huống tương tự/giải pháp được mô tả here

0

Trong hai đề xuất của bạn, tùy chọn đầu tiên trông tốt hơn một chút vì nó cho phép bạn thêm các hành động mà có thể không hoạt động mô hình cấp. Tôi đoán bạn sẽ chạy vào một trường hợp mà mô hình thứ hai không hoàn toàn đủ, và bạn sẽ cần phải thay đổi lược đồ hoặc bắt đầu rắc rối quyền truy cập trong suốt ứng dụng của bạn (ví dụ:"Người dùng không có 'tạo ra' truy cập cũng không thể chạy phương pháp xxx")

Tôi nghĩ lý do là giải pháp không trông rất khô là có sự lặp lại:

  1. Trong tên bộ phận, và
  2. Trong các khả năng của bộ phận

Đối với # 1, bạn nên tạo bảng bộ phận và cấp cho từng bộ phận một Id.

Đối với # 2, tôi đồng ý với nhận xét đầu tiên. Bạn có thể có thể nhóm các bộ điều khiển và hành động khác nhau thành các nhóm chức năng và sau đó thiết lập một mối quan hệ nhiều (nhiều bảng) giữa người dùng và các hàm. Sau đó các hàm sẽ có mối quan hệ một-nhiều với những hành động/bộ điều khiển mà chúng cho phép. Điều này sẽ cho phép bạn, với sự lặp lại tối thiểu, nói những thứ như "kế toán và bán hàng sẽ có thể đọc tất cả các bảng tài chính."

+0

Tôi đã có bảng bộ phận và bảng users_departments. Tôi đơn giản hóa bảng ví dụ cho ngắn gọn. –

Các vấn đề liên quan