Padrinoでユーザー認証機能

いつも面倒だなあと思うのはユーザー認証機能。「タマにWebアプリでも」という私にはココが楽になると大変ありがたい。ということでレッツトライ。

次作アプリにユーザー管理機能を追加しておく

$ padrino g admin
$ padrino rake ar:migrate
$ padrino rake seed
(管理者メールアドレスとパスワードを登録)

みたいな。詳しくはGUIDEのチュートリアルを参照。
これでアプリケーションルートのmodel内にAccountクラスが追加され、DBに管理用アカウントが登録される。

次作アプリに sessions コントローラを追加

名前は何でもいいんだけどAdmin機能に準拠して。

$ padrino g controller sessions

ファイルがいくつか追加される。

app/contorollers/sessions.rb を、Admin の sessions.rb からコピペ+修正で作成

MyApp.controllers :sessions do

  get :new do
    render "/sessions/new", nil, :layout => false
  end

  post :create do
    if account = Account.authenticate(params[:email], params[:password])
      set_current_account(account)
      redirect url(:xxxx, :index) #xxxxは自アプリのルートコントローラ
    elsif Padrino.env == :development && params[:bypass]
      account = Account.first
      set_current_account(account)
      redirect url(:xxxx, :index) #xxxxは自アプリのルートコントローラ
    else
      flash[:warning] = "Login or password wrong."
      redirect url(:sessions, :new)
    end
  end

  delete :destroy do
    set_current_account(nil)
    redirect url(:sessions, :new)
  end

end

app/views/sessions に new.erb を作成して、Adminのnew.erbをコピペ

見出しとかは適当に書き換え。スタイルシートが必要ならそのファイルも作成してコピペ。

app/app.rb に認証機能を導入

  ...
  register Padrino::Rendering
  register Padrino::Mailer
  register Padrino::Helpers
  register Padrino::Admin::AccessControl #追加!!

  enable :authentication  #追加!!
  enable :store_location  #追加!!
  set :login_page, "/sessions/new"  #追加!!

  enable :sessions

  access_control.roles_for :any do |role|  #ブロック追加!!
    role.protect "/"
    role.allow "/sessions"
  end

  access_control.roles_for :admin do |role|  #ブロック追加!!
    role.project_module :xxxx, "/xxxx"  #xxxx は次作アプリのコントローラ名
    role.project_module :accounts, "/accounts"
  end

実行して確認

ブラウザで/にアクセスするとログインなしで表示される。続いて/xxxxにアクセスするとログインページに遷移。ログインに成功するかbypassをチェックしておくと/xxxxの内容が表示される。
ログイン後は current_account にてユーザー情報にアクセス可能。

おしまい

ということで次作アプリに大変簡単にユーザー管理機能を追加できた。素晴らしい。Padrino△