Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Nắm vững chính sách hành động trong Ruby on Rails:Hướng dẫn thực hành để ủy quyền an toàn

Để giữ an toàn cho ứng dụng của bạn, bạn cần kiểm soát ai và những gì có thể truy cập vào ứng dụng đó. Kiểm soát quyền truy cập có thể được phân loại thành xác thực — "ai" cho phép — và ủy quyền — "những gì" họ có thể truy cập.

Xác thực là chủ đề của ngày khác, nhưng khi nói đến ủy quyền người dùng, bạn thường có hai cách để thực hiện:sử dụng chiến lược dựa trên vai trò hoặc dựa trên tài nguyên.

Trong loạt bài gồm hai phần này, chúng ta sẽ tìm hiểu sâu về cách sử dụng gem Chính sách hành động cho ứng dụng blog Ruby on Rails.

Trong phần này, chúng tôi sẽ đề cập đến những kiến thức cơ bản về Chính sách hành động.

Hãy bắt đầu!

Điều kiện tiên quyết

  • Ruby (chúng tôi đang sử dụng phiên bản 3.2.2)
  • Rails (sử dụng phiên bản 7.0.7)
  • Một số kinh nghiệm sử dụng Ruby

Trước tiên hãy bắt đầu bằng cách xác định ủy quyền dựa trên tài nguyên.

Ủy quyền dựa trên tài nguyên là gì?

Trong khi ủy quyền dựa trên vai trò tập trung vào việc đặt quyền của người dùng theo vai trò người dùng được xác định trước thì ủy quyền dựa trên tài nguyên sẽ thực thi quyền truy cập bằng cách đặt quy tắc về tài nguyên thực tế trong ứng dụng. Mỗi tài nguyên được liên kết với một chính sách xác định rõ ràng những gì người dùng có thể làm trên tài nguyên đó.

Mặc dù bài viết này tập trung vào ủy quyền dựa trên tài nguyên, nhưng việc biết được sự khác biệt giữa hai chiến lược ủy quyền có nghĩa là bạn được trang bị tốt hơn để biết mỗi chiến lược có thể làm gì.

Thời điểm sử dụng ủy quyền dựa trên vai trò

Bạn nên sử dụng ủy quyền dựa trên vai trò cho:

  • Ứng dụng đơn giản - Nếu bạn đang làm việc trên một ứng dụng có hệ thống cấp phép đơn giản và ít vai trò người dùng hơn thì chiến lược ủy quyền dựa trên vai trò có thể phù hợp với bạn.
  • Nhóm người dùng được xác định rõ ràng - Nếu ứng dụng của bạn có các nhóm người dùng được xác định rõ ràng như "quản trị viên", "biên tập viên", "người viết", v.v., hãy sử dụng ủy quyền dựa trên vai trò vì ứng dụng này xử lý việc kiểm soát quyền truy cập ở cấp vai trò người dùng.

Thời điểm sử dụng ủy quyền dựa trên tài nguyên

Ủy quyền dựa trên tài nguyên rất tốt cho:

  • Kiểm soát quyền truy cập động hoặc phức tạp - Khi nhu cầu ủy quyền của ứng dụng của bạn phát triển thường xuyên hoặc được xác định bởi các điều kiện linh hoạt thì hệ thống ủy quyền dựa trên tài nguyên sẽ đưa ra lựa chọn tốt hơn.
  • Kiểm soát chi tiết - Hữu ích khi bạn cần cho phép hoặc từ chối quyền truy cập vào tài nguyên dựa trên nhiều điều kiện (ví dụ:ứng dụng bộ phận trợ giúp Rails nơi người dùng gửi phiếu hỗ trợ dựa trên danh sách các danh mục động). Giả sử nhân viên hỗ trợ được phân công yêu cầu theo danh mục thì đây là trường hợp mà việc ủy quyền dựa trên tài nguyên sẽ thực sự phát huy tác dụng.
  • Điều khiển hướng đối tượng - Bởi vì việc ủy quyền dựa trên tài nguyên diễn ra ở cấp độ đối tượng nên việc xác định các quy tắc hướng đối tượng phức tạp sẽ dễ dàng hơn khi bạn sử dụng các kỹ thuật ủy quyền dựa trên tài nguyên.

Điều đó có nghĩa là việc bạn chọn giữa ủy quyền dựa trên vai trò hay dựa trên tài nguyên sẽ phụ thuộc vào đặc điểm riêng của ứng dụng của bạn.

Bây giờ chúng ta hãy chuyển sự chú ý của chúng ta sang viên ngọc Chính sách hành động.

Chính sách hành động quý giá cho Ruby và Rails

Chính sách hành động là một khung ủy quyền linh hoạt, có thể mở rộng và hoạt động hiệu quả cho các ứng dụng Ruby và Rails. Nó sử dụng nhiều chiến lược bộ nhớ đệm ngay lập tức, giúp quá trình này diễn ra rất nhanh, đặc biệt nếu quy tắc ủy quyền của bạn yêu cầu truy vấn cơ sở dữ liệu.

Một tính năng khác khiến viên ngọc này trở nên lý tưởng để xây dựng các quy tắc dựa trên tài nguyên là khả năng tùy chỉnh của nó. Nó cung cấp một số lớp và mô-đun Ruby có thể được kết hợp theo nhiều cách. Bạn có thể đặt khá nhiều quy tắc kiểm soát truy cập chi tiết ngoài bộ điều khiển Rails, ở bất kỳ đâu trong ứng dụng của bạn.

Hãy xem trang chủ của dự án Chính sách hành động để tìm hiểu thêm.

Bây giờ chúng ta hãy xem qua ứng dụng Rails mà chúng ta sẽ xây dựng hôm nay.

Tạo ứng dụng Rails

Trong tương lai, chúng ta sẽ tham khảo ứng dụng blog Rails 7 nơi người dùng có thể Tạo, Đọc, Cập nhật và Xóa (CRUD) bài đăng.

Chúng tôi sẽ dần dần xác định chính sách hành động cho Post mô hình cung cấp kiểm soát truy cập dựa trên tài nguyên. Bạn sẽ tìm hiểu cách sử dụng Chính sách hành động để giúp chiến lược kiểm soát quyền truy cập này hoạt động.

Hãy tiếp tục và tạo một ứng dụng Rails mới:

 

Lưu ý: Chúng tôi sẽ sử dụng các kiểu CSS Pico cho ứng dụng mẫu của chúng tôi nhưng bạn có thể sử dụng bất cứ thứ gì bạn thích.

Sau đó nhanh chóng tạo Post tài nguyên mà chúng ta sẽ sử dụng trong suốt phần còn lại của hướng dẫn:

 

Bây giờ hãy chạy quá trình di chuyển với rails db:migrate .

Thiết lập xác thực người dùng

Vì bài viết này nói về ủy quyền người dùng nên có một điều quan trọng mà chúng tôi cần đề cập đến:xác thực người dùng. Không có nó, mọi chính sách ủy quyền mà chúng tôi cố gắng xác định sau này sẽ vô ích. Nhưng không cần phải viết xác thực từ đầu. Hãy sử dụng Devise.

Cài đặt thiết bị

Bắt đầu bằng cách thêm đá quý Devise vào Gemfile của bạn:

 

Sau đó cài đặt nó và tạo User người mẫu:

 

Ngoài ra, hãy nhớ thêm config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } vào cấu hình phát triển của ứng dụng.

Tiếp theo, hãy triển khai một số vai trò cơ bản của người dùng để kiểm tra các kịch bản truy cập khác nhau của người dùng cho Post tài nguyên.

Xác định vai trò cơ bản của người dùng

Đầu tiên, thêm role cột vào bảng người dùng. Chạy lệnh này để tạo di chuyển:

 

Lưu ý: Chúng tôi sử dụng kiểu dữ liệu số nguyên cho vai trò, vì vậy chúng tôi có thể sử dụng enum — một cách nhanh chóng và dễ dàng để triển khai vai trò.

Bây giờ hãy chạy quá trình di chuyển với rails db:migrate , sau đó mở User làm mẫu và chỉnh sửa nó:

 

Khi đã xong, hãy chuyển trọng tâm sang cài đặt Chính sách hành động.

Thiết lập chính sách hành động cho Ruby và Rails

Mở Gemfile của ứng dụng và thêm dòng bên dưới:

 

Sau đó chạy lệnh bundle install để cài đặt Chính sách hành động.

Hoàn tất cài đặt bằng cách chạy:

 

Điều này sẽ cung cấp cho chúng ta cơ sở — ApplicationPolicy lớp dưới app/policies :

 

Chính sách hành động sử dụng cơ bản

Nền tảng cốt lõi của Chính sách hành động là policy lớp, ApplicationPolicy , nơi bạn có thể xác định cấu hình chung mà từ đó tất cả các chính sách có thể kế thừa. Một khuyến nghị tốt là đặt tất cả các chính sách trong app/policies và phân tách các chính sách theo tài nguyên trong ứng dụng của bạn. Ví dụ:nếu bạn có Post tài nguyên, chính sách tương ứng phải là PostPolicy , CommentPolicy sẽ đi kèm với Comment tài nguyên, v.v.

Một điều nữa cần cân nhắc khi làm việc với Chính sách hành động:các định nghĩa quy tắc phải xảy ra trong các phương thức công khai trong các lớp chính sách. Sử dụng phương pháp riêng tư sẽ gây ra lỗi.

Tiếp tục, hãy sử dụng thông tin này để tạo PostPolicy nơi chúng tôi sẽ dần dần xây dựng nhiều cấp độ truy cập khác nhau cho người dùng.

Tạo chính sách đầu tiên của chúng tôi

Tạo một tệp mới có tên post_policy.rb dưới app/policies :

 

Ở đây, chúng tôi xác định một quy tắc đơn giản trên Post khai báo tài nguyên rằng bất kỳ ai cũng có thể truy cập Post .

Liên kết bài viết với người dùng

Để làm việc với chính sách bài đăng mới này, chúng tôi cần sửa đổi Post tài nguyên mà chúng tôi đã tạo trước đó để nó được liên kết với người dùng đã đăng nhập khi tạo (bằng cách thêm user_id cột vào bảng bài viết):

 

Sau đó chạy di chuyển với rails db:migrate .

Tiếp theo, chúng ta cần sửa đổi trình điều khiển bài đăng để tính đến sự thay đổi này. Đầu tiên, hãy thêm user_id đến post_params được phép :

 

Sau đó sửa đổi create hành động:

 

Tiếp theo, hãy bảo mật PostsController .

Thực hiện ủy quyền trong bộ điều khiển

Chúng ta cần sửa đổi PostsController với lệnh gọi lại để chỉ cho phép người dùng đã đăng nhập truy cập:

 

Tiếp theo, hãy sử dụng chính sách Đăng mới để thêm một số kiểm soát quyền truy cập cơ bản của người dùng:

 

Ở đây, chúng tôi xác định quy tắc truy cập trên update của bộ điều khiển bài đăng và destroy hành động. Chúng tôi chỉ định rằng tác giả của bài đăng (hoặc người dùng có vai trò "tác giả") có thể cập nhật bài đăng nhưng chỉ tác giả của bài đăng mới có thể xóa bài đăng.

Mẹo nhanh: Chính sách hành động có thể tham chiếu current_user do Devise cung cấp và gán nó cho user trong chính sách.

Tiếp theo, chúng ta cần sử dụng quy tắc truy cập trong trình điều khiển bài đăng như sau:

 

Với quy tắc truy cập được áp dụng cho bộ điều khiển bài đăng, hành động tiếp theo của chúng tôi là đảm bảo các chế độ xem được bảo vệ.

Bảo vệ chế độ xem bằng ủy quyền

Trong ảnh chụp màn hình bên dưới, người dùng có email <user2@example.com> và vai trò "người đọc" đã được đăng nhập. Như bạn có thể thấy, người dùng này có thể xem bài đăng được tạo bởi <user@example.com> , và thậm chí họ còn có quyền truy cập vào các liên kết chỉnh sửa và xóa bài đăng này. Điều này không lý tưởng — các liên kết chỉnh sửa và xóa chỉ được cung cấp cho tác giả của bài đăng.

Nắm vững chính sách hành động trong Ruby on Rails:Hướng dẫn thực hành để ủy quyền an toàn

Nhiệm vụ đầu tiên của chúng tôi sẽ là xóa quyền truy cập vào các liên kết này đối với những người dùng không phải là tác giả của bài đăng. Vì chúng tôi đã xác định quy tắc truy cập này nên chúng tôi chỉ cần áp dụng nó cho show xem bằng cách sử dụng allowed_to? tiện lợi của Chính sách hành động phương pháp:

 

Với quy tắc này được áp dụng, giờ đây chúng tôi có thể làm mới show của bài đăng trang và xem những gì chúng tôi nhận được:

Nắm vững chính sách hành động trong Ruby on Rails:Hướng dẫn thực hành để ủy quyền an toàn

Người dùng có quyền truy cập hiện bị giới hạn những việc họ có thể làm khi xem bài đăng.

Kết thúc

Trong phần đầu tiên của loạt bài gồm hai phần này, chúng ta đã tìm hiểu một số kiến thức cơ bản về Chính sách hành động về ngọc ủy quyền.

Trong phần thứ hai và phần cuối cùng, chúng ta sẽ khám phá một số trường hợp sử dụng nâng cao hơn.

Chúc bạn viết mã vui vẻ!

Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!