Sinatra + Authlogic をやる。

More than 3 years have passed since last update.

Herokuをもっと軽く使っていこうとSinatraをいじっています。

そうなると認証が問題ですが、手に馴染んだAuthlogicを使いたいとおもいました。

軽くぐぐったところ、ログインセッション管理がデータベース仕様の時代のものだけだったので、メモを残しておきます。


ソースとそれをHerokuにそのまま乗せたもの

mmmpa/authlogic_with_sinatra

https://mmmpa-sinatra-authlogic.herokuapp.com


キモ

AuthlogicはSinatraでも使えるようにSinatraAdapterを持っており、自動でincludeされるので、特にややこしいことをせずに使えます。

ただしSinatraでセッションを有効にするのを忘れると、自分でクッキーを食わせたりするハメになって無駄な時間を使うので気をつけましょう(使いました)。

enable :sessions

あとはSinatraでActiveRecordを使えるようにすれば、Railsとほぼ同じ手順で扱えますので、以下は蛇足みたいな内容です。


ActiveRecordの準備


データベースの準備

config/database.ymlに設定を書いておくとgemがよしなにしてくれるようです。

Sinatra仕様でもHerokuにpushすると自動にすげかえてくれるので便利ですね。


config/database.yml

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などが使えます。


Gemfile

gem 'sinatra-activerecord'



Rakefile

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対策とかないので、そこらへんをどうにかして軽く動かしていけるようになりたい。