iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 23
1
Modern Web

新時代的網頁框架比較-- 淺談Rails、Django、Phoenix、Laravel系列 第 23

Phoenix起步走:建立一個購物網站--管理權限

光是有會員不夠,我們需要在會員中區分出哪些是一般會員,哪些是管理者。一般的專案可能會有更多身份,比方說會員、店家、管理者,為此會有一個欄位記錄會員的狀態。在這邊我們先將情況簡化,只有一般會員與管理者兩種,所以可以使用布林值來判斷--不是管理者就是一般會員。

新增欄位

我們先在會員新增一個欄位:

$ 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 ,就會直接被跳轉回首頁,並提示權限不足。


上一篇
Phoenix起步走:建立一個購物網站--登入
下一篇
Phoenix起步走:建立一個購物網站--會員管理
系列文
新時代的網頁框架比較-- 淺談Rails、Django、Phoenix、Laravel31

尚未有邦友留言

立即登入留言