2012-02-23 36 views
18

Tôi muốn rằng chỉ có người dùng của tôi có đặt thuộc tính is_admin của họ là true để có thể truy cập quản trị hoạt động của tôi backendLàm thế nào để hạn chế quyền truy cập vào quản trị tích cực cho người dùng quản trị

làm thế nào tôi nên làm điều này?

Người dùng "thông thường" chỉ có thể đăng nhập vào trang web, không thể đăng nhập vào quản trị viên đang hoạt động.

Trả lời

38

Trong config/initializers/active_admin.rb bạn có cấu hình như vậy:

config.authentication_method = :authenticate_admin_user! 

vì vậy nếu bạn tạo ra một phương thức có tên authenticate_admin_user! trong ApplicationController, sau đó ActiveAdmin sẽ kiểm tra xem người dùng có thể truy cập các trang quản trị hay không. Như thế này:

# restrict access to admin module for non-admin users 
def authenticate_admin_user! 
    raise SecurityError unless current_user.try(:admin?) 
end 

cứu nạn từ đó ngoại lệ trong ApplicationController (hoặc bạn thực sự có thể chuyển hướng bên trong phương pháp authenticate_admin_user!)

rescue_from SecurityError do |exception| 
    redirect_to root_url 
end 

Và thêm một điều nhỏ, nếu bạn không có admin_users, sau đó nó sẽ được tốt đẹp để thay đổi dòng này trong config/initializers/active_admin.rb:

config.current_user_method = :current_user 

Và với devise bạn có thể muốn làm cho đường dẫn mặc định khác nhau cho admin/Không phải quản trị người dùng, do đó bạn có thể định nghĩa after_sign_in_path_for phương pháp trong điều khiển

# path for redirection after user sign_in, depending on user role 
def after_sign_in_path_for(user) 
    user.admin? ? admin_dashboard_path : root_path 
end 
+0

Điều này có vẻ như một giải pháp tốt, bu current_user dường như không có sẵn trong ApplicationController ... Tôi có thể đặt nó ở một nơi khác? Bộ điều khiển –

+0

mm thực sự là nơi mà nó được sử dụng nhiều nhất. Vậy bạn có vấn đề gì, nó trả về nil hoặc NoMethodError? – alony

+0

Nó trả về 0; 'phương thức không xác định 'admin?' cho nil: NilClass'. Tôi DID xác định .admin? phương pháp, vì vậy đó không phải là nó. Tôi tìm thấy một số trường hợp current_user không có sẵn trong ApplicationControlller, có vẻ như bạn không phải acces nó từ đó. –

0

Đối với người dùng "Bình thường", bạn nên viết logic riêng để đăng nhập vào trang web hoặc có thể tôi không hiểu tại sao bạn muốn cho phép người dùng đăng nhập thông qua quản trị viên đang hoạt động. Quản trị viên đang hoạt động sử dụng devise, chỉ cần tạo một mô hình khác có tên là User.

+0

Không, đó không phải những gì tôi muốn làm, vì người dùng quản trị nên có thể sử dụng phần phía trước của trang web quá. Tôi tin rằng thực tiễn tốt là chỉ có một mô hình người dùng. –

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