Khi bạn xây dựng một ứng dụng rails với nhiều vai trò của người dùng, tôi nghĩ tại thời điểm này, điều bạn lo lắng nhất là phân cấp người dùng của bạn. Bây giờ bạn có rất nhiều giải pháp để giải quyết vấn đề này. Nhưng bây giờ trong bài viết này tôi sẽ cho bạn thấy một gem pundit
để quản lý vai trò người dùng.
Pundit là gì?
Gem pundit
là một thư viện giúp xây dựng một hệ thống để giới hạn tài nguyên của người dùng được ủy quyền. Nếu bạn cần giới hạn các quyền truy cập đối với một số người dùng nhất định, vai trò tách biệt cho người dùng trong ứng dụng của bạn sẽ xuất hiện. Vì vậy, bạn có thể sử dụng Pundit
để quản lý vấn đề đó. Pundit
giúp chúng tôi xác định chính sách là PORC.
Chúng tôi vẫn sẽ cần xác định vai trò của người dùng của chúng tôi. Nhưng bây giờ lợi thế của chúng tôi là giảm thiểu cho các bộ điều khiển và mô hình. Chính sách sẽ xử lý phần phức tạp nhất cho mô hình / bộ điều khiển là cho phép truy cập vào một trang cụ thể.
Cách bạn làm việc với Pundit
Bước 1: Bạn tạo một lớp Chính sách liên quan đến việc cho phép truy cập vào một loại bản ghi cụ thể.
Bước 2: Bạn gọi hàm ủy quyền tích hợp, chuyển qua những gì bạn đang cố gắng ủy quyền truy cập.
Bước 3: Pundit sẽ tìm lớp Chính sách phù hợp và gọi phương thức Chính sách khớp với tên của phương thức bạn đang ủy quyền. Nếu nó trả về đúng, bạn có quyền thực hiện hành động. Nếu không, nó sẽ ném một ngoại lệ.
Thiết lập Pundit
Tôi nghĩ rằng nó là dễ dàng để thiết lập đá quý này. Để được hướng dẫn rõ ràng, bạn có thể kiểm tra tài liệu của Gem. Bây giờ bắt đầu thiết lập nó:
- Thêm
gem "pundit"
vàoGemfle
- Thêm
Include Pundit
vàoapplication controller
- Chạy
bundle install
rails g pundit:install
sẽ tạo và thiết lập chính sách mặc định cho ứng dụng của bạn và được xác định tại ứng dụng / chính sách đường dẫn.
Bây giờ bạn có thể kiểm tra ví dụ application_controller.rb
như dưới đây:
1 2 3 4 5 6 7 8 9 10 11 12 | class ApplicationController < ActionController::Base include Pundit rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized protect_from_forgery with: :exception private def user_not_authorized flash[:error] = "Access Deny" redirect_to request.referrer || new_user_session_path end end |
Bây giờ bạn thấy tệp mặc định của Pundit là application_policy.rb như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class ApplicationPolicy attr_reader :user, :model def initialize current_user, model raise Pundit::NotAuthorizedError,"login" unless user @user = user @model = model end def index end def show end . . . end |
Đối với mã ở trên, bạn có thể thấy:
- Xác minh đầu tiên là
user
và trongpundit
bộ điều khiển sẽ được thông quacurrent_user
- Xác minh thứ hai là mô hình mà chúng ta cần phải ủy quyền. Chính sách trong pundit và bộ điều khiển sẽ có cùng chức năng để kiểm tra chính sách trong chức năng đó.
Ví dụ: trong users_controller.rb
của bạn:
1 2 3 4 5 6 7 8 9 10 11 | class UsersController < ApplicationController def show end def index @users = User.all end end |
Sau đó, trong user_policy.rb sẽ có các hàm tương ứng như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class UserPolicy < ApplicationPolicy class Scope attr_reader :user, :scope def initialize user, scope @user = user @scope = scope end def index? @user.admin? end def show? @user.present? end end |