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△