我正在使用Rails 5和Devise 3.5.1.
阅读一本关于创建/测试API的好(旧)书,该书使用Devise身份验证.它是在Rails 5之前编写的,所以我选择不使用新的api-only版本.
这是我的测试......
#/spec/controllers/api/v1/users_controller_spec.rb
require 'rails_helper'
describe Api::V1::UsersController, :type => :controller do
before(:each) { request.headers['Accept'] = "application/vnd.marketplace.v1" }
describe "GET #show" do
before(:each) do
@user = FactoryGirl.create :user
get :show, params: {id: @user.id}, format: :json
end
it "returns the information about a reporter on a hash" do
user_response = JSON.parse(response.body, symbolize_names: true)
expect(user_response[:email]).to eql @user.email
end
it { should respond_with 200 }
end
end
Run Code Online (Sandbox Code Playgroud)
这是一个完全出乎意料的RSpec错误
Devise::MissingWarden:
Devise could not find the `Warden::Proxy` instance on your request environment. …
Run Code Online (Sandbox Code Playgroud) 我有我的rails应用程序,我遇到了一个设计的主要问题.我有一个控制器:
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
Run Code Online (Sandbox Code Playgroud)
问题是它永远不会记录用户,它总是停在这一行
resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
Run Code Online (Sandbox Code Playgroud)
我甚至在实际的宝石文件中放了大量的记录器,看看我是否可以看到任何东西但没有任何东西,我真的不知道如何解决这个问题.如果我注释掉这一行,那么用户就会登录,但如果电子邮件不在数据库中并且适用于任何密码(这绝对不是正确的解决方案),则会失败
我该如何解决?
UPDATE
这有效,但似乎非常hackish
# POST /resource/sign_in
def create
resource = User.find_by_email(params[:user][:email])
redirect_to(new_user_session_path, :notice => 'Invalid Email …
Run Code Online (Sandbox Code Playgroud) 我正在使用Devise和Ruby on Rails.
如果未经身份验证的用户尝试访问需要身份验证的页面,建议将其重定向到会话#new页面?
现在我得到一个错误,说明没有路由匹配他们尝试访问的路由(导致生产中出现404错误).
我刚刚开始测试Devise.我无法理解为什么我会收到此错误::
Failure/Error: subject.current_user.should_not be_nil
ArgumentError:
uncaught throw :warden
Run Code Online (Sandbox Code Playgroud)
这是我的规范中的代码::
require "spec_helper"
describe Devise::PasswordsController do
include Devise::TestHelpers
before(:each) do
user = Factory(:user)
@request.env["devise.mapping"] = Devise.mappings[:user]
sign_in user
end
it "should have a current user" do
subject.current_user.should_not be_nil
end
end
Run Code Online (Sandbox Code Playgroud)
有没有人解决这个问题?我知道有问题,github
但在他们的情况下include Devise::TestHelpers
不存在与我的情况不同.
我在这一行收到错误:: subject.current_user.should_not be_nil
我对铁杆比较陌生.我有Devise设置,并希望在用户登录后运行一些回调代码.
查看Warden wiki页面,我可以使用"after_set_user"回调来执行此逻辑,例如:
Warden::Manager.after_set_user do |user, auth, opts|
unless user.active?
auth.logout
throw(:warden, :message => "User not active")
end
end
Run Code Online (Sandbox Code Playgroud)
但是,我不确定我应该在哪里存储这些东西.我的第一个想法是我可以把它放在config/initializers/devise.rb中.那是对的吗?在config目录中放置本质上是控制器代码的感觉并不合适.
我能够使用Devise的sign_in
方法在我的控制器规范中登录用户.但是现在我正在从我的应用程序中删除Devise,我不太确定如何使用Warden自己的类似功能.
我应该如何设置spec/spec_helper.rb
和相关spec/support/*.rb
文件以使Warden在控制器规格内充分运行?
我已尝试spec/support/warden.rb
使用以下内容设置文件:
RSpec.configure do |config|
config.include Warden::Test::Helpers
config.after do
Warden.test_reset!
end
end
Run Code Online (Sandbox Code Playgroud)
然后我有before
类似的调用来验证user
工厂:
before { login_as FactoryGirl.create(:user) }
Run Code Online (Sandbox Code Playgroud)
但这是我一直看到的错误:
NameError:
undefined method `user' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
此错误追溯到authenticate_user!
控制器中的方法:
def authenticate_user!
redirect_to login_path, notice: "You need to sign in or sign up before continuing." if env['warden'].user.nil?
end
Run Code Online (Sandbox Code Playgroud)
我很感激任何人都可以提供的任何指导.
Rails会话中的"数据"如下所示:
{"warden.user.user.key" => [[1], "long-random-string"]}
Run Code Online (Sandbox Code Playgroud)
1是用户ID.什么是长随机字符串?
这是由Rails或Devise处理/使用的东西吗?
如何防止会话存储在JSON/XML调用上创建会话?
我的问题是我在数据库中保存会话,并在多个api调用中被淹没.
我正在使用Rails 3.2.2和Devise进行身份验证.
Active Admin是一个用于在应用程序中使用管理仪表板的gem.它使用Devise登录用户并admin_user
为管理员创建单独的模型.我的应用程序已经使用了设计并将其用户作为user
模型.自从我开始使用活动的admin gem之后,在我的路由文件中,即使我的用户已登录,以下行仍然会解析为home #index而不是用户#spaceboard.这在以前登录用户被带到用户的时候工作得很好#dashboard作为根网址.
root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'
Run Code Online (Sandbox Code Playgroud)
发生的事情是.authenticate?
检查是否admin_user
属于(属于Active Admin)登录或不登录我的user
模型,这是我需要检查的,所以当我登录到活动管理界面时,我的站点root成为用户#dashboard而不检查是否user
已登录.如何.authenticate?
检查user
登录信息admin_user
?
任何帮助或线索将非常感谢
我正在使用Devise,并依赖于用户模型的last_sign_in_at来计算我的客户是否在X天内没有返回.但是,我最近发现last_sign_in_at仅在实际的表单登录事件发生时更新,而不是由于包含可记住的用户而自动登录时.
如果想要确保每次用户登录时更新last_sign_in_at(新的浏览器会话),无论他们是使用表单登录还是由可记忆的cookie自动登录,我将如何在设计兼容的方式?