Sinatra + Authlogic をやる。
Herokuをもっと軽く使っていこうとSinatraをいじっています。
そうなると認証が問題ですが、手に馴染んだAuthlogicを使いたいとおもいました。
軽くぐぐったところ、ログインセッション管理がデータベース仕様の時代のものだけだったので、メモを残しておきます。
ソースとそれをHerokuにそのまま乗せたもの
https://mmmpa-sinatra-authlogic.herokuapp.com
キモ
AuthlogicはSinatraでも使えるようにSinatraAdapterを持っており、自動でincludeされるので、特にややこしいことをせずに使えます。
ただしSinatraでセッションを有効にするのを忘れると、自分でクッキーを食わせたりするハメになって無駄な時間を使うので気をつけましょう(使いました)。
enable :sessions
あとはSinatraでActiveRecordを使えるようにすれば、Railsとほぼ同じ手順で扱えますので、以下は蛇足みたいな内容です。
ActiveRecordの準備
データベースの準備
config/database.yml
に設定を書いておくとgemがよしなにしてくれるようです。
Sinatra仕様でもHerokuにpushすると自動にすげかえてくれるので便利ですね。
default: &default
adapter: postgresql
encoding: unicode
pool: 5
username: <%= ENV['PG_USER'] %>
password: <%= ENV['PG_PASSWORD'] %>
development:
<<: *default
database: <%= ENV['PG_DATABASE_NAME'] %>_development
マイグレーション
以下をすることにより、おなじみのrake db:migrate
などが使えます。
gem 'sinatra-activerecord'
require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'
マイグレーションファイルを作成する。Authlogicのattributesはお好みで。
bundle exec rake:create_migration NAME=create_user
class CreateUser < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :login, null: false
t.string :email, null: false
t.string :crypted_password, null: false
t.string :password_salt, null: false
t.string :persistence_token
t.string :single_access_token
t.string :perishable_token
t.integer :login_count, default: 0, null: false
t.integer :failed_login_count, default: 0, null: false
t.datetime :last_request_at
t.datetime :current_login_at
t.datetime :last_login_at
t.string :current_login_ip
t.string :last_login_ip
t.timestamps null: false
end
end
end
Authlogicの準備
Railsで使うときと設定内容は同じです。
User
require 'active_record'
require 'authlogic'
class User < ActiveRecord::Base
acts_as_authentic do |config|
config.login_field = :login
config.require_password_confirmation = false
end
end
UserSession
require 'authlogic'
class UserSession < Authlogic::Session::Base
end
Sinatraの準備
セッションを有効に
大切です。忘れると時間を無駄に費やします。
enable :sessions
Sinatra+ActiveRecordで発生するタイムアウト対策を
after do
ActiveRecord::Base.connection.close
end
ルーティング
承認あたりはこんな感じで。
before '/room' do
redirect '/in' unless !!UserSession.find
end
before '/in' do
redirect '/room' if !!UserSession.find
end
作成、セッション開始などはいつものAuthlogicです。
authlogic_with_sinatra/app.rb at master · mmmpa/authlogic_with_sinatra
あと
Authlogicに限らずですがCSRF対策とかないので、そこらへんをどうにかして軽く動かしていけるようになりたい。