承接上一篇 “快速實作使用者驗證機制”,接著要建立後台管理的部分

目標:

  1. 建立管理選單- 可將使用者分為管理員和一般使用者
  2. ㄧ般使用者無法登入後台,如存取管理頁面時,將被提示權限不足訊息無法存取,並轉向適當頁面
  3. 管理員能在後台更新使用者角色,並且刪除使用者後,也一併刪除該使用者的任務

Routes

要建立後台之前,要先想好之後的路徑要怎麼設計?我們可以選擇加 admin 在路徑前面,再使用 namespace 方法把 resources 包起來 https://ithelp.ithome.com.tw/upload/images/20201008/20120868bppspAghmS.png 不過這樣的設計可能會有一個隱憂,就是後台網址容易被猜出來而增加被攻擊的機會, 還好我們可以在 :path 後面指定比較難被猜出來的路徑。 https://ithelp.ithome.com.tw/upload/images/20201008/201208689IUAsGAqUB.png 之前路由就會變成下圖 https://ithelp.ithome.com.tw/upload/images/20201008/20120868c5K04NH7UM.png

Controller

確定好後台路徑後,就可以開始設定 controller。 在 rails 預設的情況下所有的 controller 都是繼承自 ApplicationController https://ithelp.ithome.com.tw/upload/images/20201008/20120868xd1Jt8L7LR.png 打開 application_controller.rb 檔案會發現 ApplicationController 則是繼承自 ApplicationController::Base https://ithelp.ithome.com.tw/upload/images/20201008/20120868uiRNwVN22b.png 因此,我們可以利用物件導向設計的繼承概念,把共同會使用到的方法集中在上層類別中,例如後台的登入檢查、或是權限控管等功能。

實作例子:後台系統裡的每一個 controller 都需要有權限控管的設定

步驟:

  1. 新增一個 Admin::BaseContorller 類別
  2. 將權限控管的檢查( admin_check )設定在 before_action 上
  3. 後台內的 UsersController 都改繼承 Admin::BaseContorller https://ithelp.ithome.com.tw/upload/images/20201008/201208688B2TGJ1U6n.png https://ithelp.ithome.com.tw/upload/images/20201008/20120868TZD55I9itg.png

Model

首先需要增加一個 User model 的屬性,蠻直覺的做法是用 String 直接代表使用者的角色。但也可以採取另一種更簡易的方法就是設定屬性為 boolean,初始值為 False https://ithelp.ithome.com.tw/upload/images/20201008/20120868VWiuNGawTX.png

所以新增一個 migration 在 user table 上: 在終端機下指令:rails g migration add_admin_to_users admin:boolean

在 migration file 這邊如果沒有設定 admin 的 default valse 為 false 其實也可以,因為 admin 的初始值就會是 nil, ㄧ樣會是 false。但是有寫上去就比清楚,增加可閱讀性。 https://ithelp.ithome.com.tw/upload/images/20201008/20120868dmJtEJa1V1.png

檢視沒問題後,在終端機下指令:rails db:migrate 再到 rails console 裡確認看看,這裡用 toggle!(:admin) 就可以把 boolean 值轉成 true 了。 https://ithelp.ithome.com.tw/upload/images/20201008/20120868u70r7Dk6ye.png 由於希望刪除使用者後,也一併刪除該使用者的任務,就需要加入以下程式碼在 User model 裡 https://ithelp.ithome.com.tw/upload/images/20201008/20120868kgYbWpOuo5.png

Views

前後台都有各自的 controller 也會有獨立的對應頁面,其實就是很簡單的 CRUD,這裡就不詳細介紹。 比較想提到的是在使用者列表頁面,要呈現使用者的角色的部分。 https://ithelp.ithome.com.tw/upload/images/20201008/20120868F6PEwjhSrA.png https://ithelp.ithome.com.tw/upload/images/20201008/20120868kNiOzDVaku.png 上圖中的 user_role(user.admin) 則是將布林值傳給 user_role 方法,會得到字串值為 “管理員” 或是 “會員” 再顯示在使用者列表頁面上。 接著下個部分希望只有管理員在登入系統時會看到進入‘後台’的連結,因此需要加入檢查權限的程式碼 https://ithelp.ithome.com.tw/upload/images/20201008/20120868e0RcgSJCiq.png 只有在使用者為ADMIN的情況下,才可以看到後台的連結 (如下圖) https://ithelp.ithome.com.tw/upload/images/20201008/20120868QCwYMeOaLx.png 在前面介紹 Controller 裡有設定 login_check,此時在這裡就可以確認是有正常運作的。 https://ithelp.ithome.com.tw/upload/images/20201008/20120868lN0G4gGrak.png

即使是會員(下圖中的會員Annie)已登入的狀態下,點選使用者列表的連結就會出現 ‘權限不足’ 的訊息。 https://ithelp.ithome.com.tw/upload/images/20201008/20120868tXdgSzJXz1.png

參考資料:

  • Action Controller Overview - Ruby on Rails Guides](https://guides.rubyonrails.org/action_controller_overview.html)