12/08/2018, 15:53

Admin login as User with gem user_impersonate2

Có khi nào bạn tự hỏi người dùng đang làm những gì trong hệ thống của mình không? Nếu bạn đang triển khai 1 hệ thống, bạn ghi log, đọc log, query trong cơ sở dữ liệu của mình, bla bla, -> cũng không vất vả lắm nhỉ (yaoming) ( không bàn đến khía cạnh của khách hàng) chúng ta là những lập trình ...

Có khi nào bạn tự hỏi người dùng đang làm những gì trong hệ thống của mình không? Nếu bạn đang triển khai 1 hệ thống, bạn ghi log, đọc log, query trong cơ sở dữ liệu của mình, bla bla, -> cũng không vất vả lắm nhỉ (yaoming) ( không bàn đến khía cạnh của khách hàng) chúng ta là những lập trình viên thông minh việc này có gì khó đâu

Và như tiêu đề, hôm nay mình muốn giới thiệu với các bạn một gem hỗ trợ việc quản lý người dùng trong hệ thống - gem user_impersonate2 giúp chúng ta có thể query xem người dùng đang mò mẫm gì trong hệ thống của chúng ta. Như tiêu đề của nó user impersonate -> chính là việc mạo danh người dùng

Overview

user_impersonate2 cho phép người dùng nhân viên giả mạo người dùng bình thường: xem những gì họ nhìn thấy và chỉ làm những gì họ có thể làm.

Khái niệm và mã này được trích từ Engine Yard Cloud, mà Công cụ Yard sử dụng để hỗ trợ khách hàng từ xa.

Để sử dụng gem này bạn cần phải cài đặt gem Devise Tuy nhiên nếu bạn tự build user mà không thông qua gem Devise thì cũng vẫn có thể dùng được bằng cách tạo hàm authenticate_user! trong controller

Ví dụ sử dụng: Khi bạn mạo nhận người dùng, bạn sẽ thấy những gì họ thấy với phần tiêu đề ở trên. Theo mặc định, đây sẽ là màu đỏ. -> cá nhân mình thấy thì bạn nên custom lại cái này cho đẹp, nhìn cho chuyên nghiệp hơn

Installation

Thêm gem user_impersonate2 vào Gemfile và chạy bundle

gem 'user_impersonate2', :require => 'user_impersonate'

Lưu ý rằng: require => 'user_impersonate' is required vì gem này hiện đang duy trì cấu trúc thư mục nội bộ giống như gem user_impersonate ban đầu. Điều này có thể thay đổi trong các phiên bản tương lai nhưng được giữ lại cho tính tương thích trong thời gian này. Tiến hành chạy lệnh

bundle
rails generate user_impersonate

Dòng dưới đây sẽ được tự động generate vào trong config/routes.rb :

mount UserImpersonate::Engine => "/impersonate", as: "impersonate_engine"

Bước tiếp theo chúng ta sẽ thêm impersonation header vào layout:

<% if current_staff_user %>
  <%= render 'user_impersonate/header' %>
<% end %>

Kế tiếp chúng ta sẽ cấu hình staff vào trong model, tùy vào từng role mà hệ thống của bạn định nghĩa mà hàm staff sẽ trả về true or false

# app/models/user.rb

def staff?
  true # this user can login as user impersonate
end

# String to represent a user (e-mail, name, etc.)
def to_s
  email
end

Example: trong bảng model chúng ta phân quyền với trường role_name, ta sẽ cấu hình như sau

# app/models/user.rb
Role_Staff = [:admin, :sysadmin]
def staff?
  Role_Staff.include? role_name
end

# String to represent a user (e-mail, name, etc.)
def to_s
  email
end

Bây giờ bạn có thể truy cập theo link http://localhost:3000/impersonate để xem kết quả. Giao diện mặc định sẽ như hình bên dưới.

Click chọn mạo danh 1 user Để quay về account admin, bạn chỉ cần click vào button Revert to admin trên màn hình.

-> chỉ bằng vài bước ngắn gọn như trên chúng ta có thể hoàn toàn kiểm soát được user đang làm gì trong hệ thống mà ko phải thực hiện các câu truy vấn, căng mắt ngồi đọc, soi log (ahaha)

Customization

Header

Bạn có thể override lại header bằng cách tạo một file app/views/user_impersonate/_header.html.erb Dưới đây là một cách thức overvirride theo HAML

%div#impersonating
  .impersonate-controls.page
    .impersonate-info.grid_12
      You (
      %span.admin_name= current_staff_user
      ) are impersonating
      %span.user_name= link_to current_user, url_for([:admin, current_user])
      ( User id:
      %span.user_id= current_user.id
      )
      - if current_user.no_accounts?
        ( No accounts )
      - else
        ( Account name:
        %span.account_id= link_to current_user.accounts.first, url_for([:admin, current_user.accounts.first])
        , id:
        %strong= current_user.accounts.first.id
        )
    .impersonate-buttons.grid_12
      = form_tag url_for([:ssh_key, :admin, current_user]), :method => "put" do
        %span Support SSH Key
        = select_tag 'public_key', options_for_select(current_staff_user.keys.map {|k| k})
        %button{:type => "submit"} Install SSH Key
      or
      = form_tag [:admin, :revert], :method => :delete, :class => 'revert-form' do
        %button{:type => "submit"} Revert to admin

Summary

Bài viết đã trình bày một vài bước cơ bản để bạn có thể kiểm soát được người dùng trong hệ thống,. Hi vọng bài viết có thể giúp các bạn quản lý được ứng dụng của mình, thay vì tự tạo modul chúng ta có thể sử dụng trực tiếp user_impersonate2. Chúc các bạn thành công!!!

0