光是有會員不夠,我們需要在會員中區分出哪些是一般會員,哪些是管理者。一般的專案可能會有更多身份,比方說會員、店家、管理者,為此會有一個欄位記錄會員的狀態。在這邊我們先將情況簡化,只有一般會員與管理者兩種,所以可以使用布林值來判斷--不是管理者就是一般會員。
我們先在會員新增一個欄位:
$ mix ecto.gen.migration add_admin_to_users
* creating priv/repo/migrations/20171226122219_add_admin_to_users.exs
打開檔案,貼上:
def change do
alter table(:users) do
add :admin, :boolean, default: false
end
end
接著執行migrate:
$ mix ecto.migrate
[info] == Running Shop.Repo.Migrations.AddAdminToUsers.change/0 forward
[info] alter table users
[info] == Migrated in 0.0s
欄位新增後,需要到model去修改schema
schema "users" do
field :email, :string
field :encrypted_password, :string
field :password, :string, virtual: true
field :username, :string
field :admin, :boolean
timestamps()
end
因為功能還沒完成,所以我們先用iex手動把某一個會員更改為管理者。
$ iex -S mix
> user = Shop.Repo.get!(Shop.User, 1)
%Shop.User{__meta__: #Ecto.Schema.Metadata<:loaded, "users">, admin: false,
email: "jace_ka@yahoo.com.tw",
encrypted_password: "$2b$12$ET6V7r.6qi/3xoS4M2U9auXXJOTLl/kcME39g0gyLkAoxILWebgQK",
id: 1, inserted_at: ~N[2017-12-25 01:52:05.179589], password: nil,
updated_at: ~N[2017-12-25 01:52:05.181295], username: "bater"}
> user |> Ecto.Changeset.change(%{admin: true}) |> Shop.Repo.update
[debug] QUERY OK db=2.3ms
UPDATE "users" SET "admin" = $1, "updated_at" = $2 WHERE "id" = $3 [true, {{2017, 12, 26}, {12, 37, 34, 820737}}, 1]
{:ok,
%Shop.User{__meta__: #Ecto.Schema.Metadata<:loaded, "users">, admin: true,
email: "jace_ka@yahoo.com.tw",
encrypted_password: "$2b$12$ET6V7r.6qi/3xoS4M2U9auXXJOTLl/kcME39g0gyLkAoxILWebgQK",
id: 1, inserted_at: ~N[2017-12-25 01:52:05.179589], password: nil,
updated_at: ~N[2017-12-26 12:37:34.820737], username: "bater"}}
可以觀察到admin
欄位由false改為true,現在第一位使用者是管理員了。(這邊的id請改為你想變更的會員id)
我們之前就已經寫了驗證,現在只要把驗證是否為管理員加入就可以了。打開user_controller,在確認會員登入的if 條件加上&& conn.assigns.current_user.admin
(且必須是管理員):
def authenticate(conn, _params) do
if conn.assigns.current_user && conn.assigns.current_user.admin do
conn
else
conn
|> put_flash(:error, "You must log in to access that page.")
|> redirect(to: page_path(conn, :index))
|> halt
end
end
記得要重啟伺服器,現在如果用一般會員想要訪問 http://localhost:4000/admin/products ,就會直接被跳轉回首頁,並提示權限不足。