2017-08-05に投稿

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を変えるだけで実装できる。

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント