Railsアプリケーションがあり、deviseで重大な問題が発生しています。コントローラがあります。
class Users::SessionsController < Devise::SessionsController
prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
include Devise::Controllers::InternalHelpers
def new
clean_up_passwords(build_resource)
respond_to do |format|
format.html { render :layout => "sessions" }
format.mobile
end
end
# POST /resource/sign_in
def create
resource = User.find_by_email(params[:user][:email])
resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
set_flash_message :notice, :signed_in
sign_in_and_redirect(resource_name, resource)
end
end
問題は、ユーザーがログインすることはなく、常にこの行で停止することです。
resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
実際のgemファイルに何トンものロガーを入れて、何も見えないものがないかどうかを確認しましたが、実際にこれを修正する方法がわかりません。この行をコメントアウトすると、ユーザーはログインしますが、電子メールがデータベースになく、任意のパスワードで機能する場合は失敗します(これは間違いなく正しい解決策ではありません)
どうすれば修正できますか?
更新
これは機能しますが、非常にハックのようです
# POST /resource/sign_in
def create
resource = User.find_by_email(params[:user][:email])
redirect_to(new_user_session_path, :notice => 'Invalid Email Address or Password. Password is case sensitive.') and return if resource.encrypted_password.blank?
bcrypt = BCrypt::Password.new(resource.encrypted_password)
password = BCrypt::Engine.hash_secret("#{params[:user][:password]}#{resource.class.pepper}", bcrypt.salt)
valid = Devise.secure_compare(password, resource.encrypted_password)
# resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
if valid
set_flash_message :notice, :signed_in
sign_in_and_redirect(resource_name, resource)
else
redirect_to(new_user_session_path, :notice => 'Invalid Email Address or Password. Password is case sensitive.') and return
end
end
ユーザーをサインインする場合は、sign_in
コントローラのアクション内のヘルパー:
sign_in(:user, user)
resource = warden.authenticate!(:scope => resource_name)
sign_in(resource_name, resource)
標準のcreate
アクションの仕組みは次のとおりです。
# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message!(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
この投稿は、要求仕様のログインを設定するのに役立ちました。 https://makandracards.com/makandra/37161-rspec-devise-how-to-sign-in-users-in-request-specs
_module DeviseRequestSpecHelpers
include Warden::Test::Helpers
def sign_in(resource_or_scope, resource = nil)
resource ||= resource_or_scope
scope = Devise::Mapping.find_scope!(resource_or_scope)
login_as(resource, scope: scope)
end
def sign_out(resource_or_scope)
scope = Devise::Mapping.find_scope!(resource_or_scope)
logout(scope)
end
end
_
Spec_helperに含めます
_RSpec.configure do |config|
config.include DeviseRequestSpecHelpers, type: :request
end
_
必要に応じてサインインします
sign_in create(:user, name: 'John Doe')