一人もくもく会 α verでサービス開始しました。

Phoenixでadminルーティングの認証

Phoenixでadminルーティングしてそこだけ認証を入れる。

仕様

  • /admin/articles のように最初にadminを含むURLは管理画面
  • 管理画面は管理者ユーザーで認証が必要
  • 管理画面もgen.htmlで自動生成。自分で頑張って作ったりしない
  • コントローラやアクション毎に全部認証チェックを書いたりしない

モデルを作る

mix phoenix.gen.model でモデルだけ先に作る。もちろんgen.htmlでルーティングのない箇所のCRUDと一緒にモデルを作ってもいい。

管理者側ページを作る。

下記でadmin向けページを作成できる。

mix phoenix.gen.html Admin.Article articles --no-model title:string ....

これでコントローラやテンプレートも全部adminフォルダに分けて作ってくれる。 モデルのaliasにAdminが含まれているのでそこだけ削除。

認証チェックを行う

認証されていない場合にログイン画面へリダイレクトする。まず下記のようなPlugを作る。 (下記のようにAuthモジュールを作るなり直接セッションで見るなりする)

defmodule App.Plug.Prefix do
  import Plug.Conn

  alias App.Auth

  def init(default), do: default

  def call(conn, params) do
    [prefix] = params
    if !Auth.get_user(conn, prefix) do
      Phoenix.Controller.redirect(conn, to: "/admins/login")
      |> halt
    end
    conn
  end
end

(調べたらどこもhaltしてたんだけどほんとにこれでいいんだろうか)

ルーティングの設定

ルーティングで先程のPlugを導入。pipelineで実装。ついでにレイアウトはadmin.html.eexを使用するようにもしておく。

  pipeline :admin do
    plug :put_layout, {App.LayoutView, :admin}
    plug App.Plug.Prefix, [:admin]
  end

URLのルーティング。pipelineは複数設定できるらしい。

  scope "/admin", App, as: :admin do
    pipe_through [:browser, :admin]

    get "/admins/logout", Admin.AdminController, :logout
    resources "/admins", Admin.AdminController
  end

まとめ

これで管理画面側の処理を別に出来た。通常のユーザーのマイページなども同様にしてatomを変えるだけで実装できる。