routes.rbでSorceryの承認もやっていく。

rssフィードみてたらSorcery使う記事があったので。

例によってconstraints

PersonというSorcery用のモデルがあるとして、current_user取得処理内のlogin_from_sessionの成功を以て承認とします。

class Constraint::PersonConfig
  def matches?(request)
    !!Person.sorcery_adapter.find_by_id(request.session[:user_id])
  end
end
  scope :person_configs, module: :users, constraints: Constraint::PersonConfig.new do
    get 'index', to: 'configs#index'
    get 'password', to: 'passwords#edit'
    put 'password', to: 'passwords#update'
  end

  get 'person_configs/*path', to: ->(env) { [403, {'Content-Type' => 'text/plain'}, ['forbidden']] }

はじめて試したけど簡単っぽい

最小限だとこれだけだし

t.string :email,            :null => false
t.string :crypted_password
t.string :salt

コントローラーにloginlogoutというメソッドが用意されるのでそれ使えば簡単にインアウトできる。 いわゆるcurrent_userの取得はPersonだろうがBloggerだろうがcurrent_user一択。

一般的なメソッド名とかを容赦なく定義していってて大胆っぽい。

request_specでSorceryアカウントにサインインするには

コントローラーとフィーチャーでは

RSpec.configure do |config|
  config.include Sorcery::TestHelpers::Rails::Controller, type: :controller
  config.include Sorcery::TestHelpers::Rails::Integration, type: :feature
end
@person = Person.create!(email: 'a@a.com', password: 'aaa', password_confirmation: 'aaa')
login_user(@person)

でいけるっぽいんですがリクエストではダメだったので例によって普通にこれ。

before :each do
  @person = Person.create!(email: 'a@a.com', password: 'aaa', password_confirmation: 'aaa')
  post '/person_sessions', email: 'a@a.com', password: 'aaa'
end