标签: warden

为什么我的RSpec没有加载Devise :: Test :: ControllerHelpers?

我正在使用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)

ruby-on-rails devise rspec-rails warden

44
推荐指数
2
解决办法
1万
查看次数

如何使用devise登录用户?

我有我的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)

ruby ruby-on-rails devise warden ruby-on-rails-3

35
推荐指数
1
解决办法
2万
查看次数

如果用户未使用Devise进行身份验证,则重定向到登录页面

我正在使用Devise和Ruby on Rails.

如果未经身份验证的用户尝试访问需要身份验证的页面,建议将其重定向到会话#new页面?

现在我得到一个错误,说明没有路由匹配他们尝试访问的路由(导致生产中出现404错误).

ruby-on-rails devise warden ruby-on-rails-4

25
推荐指数
2
解决办法
3万
查看次数

未捕获的投掷:设计测试中的监狱长

我刚刚开始测试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

testing rspec ruby-on-rails devise warden

21
推荐指数
1
解决办法
8190
查看次数

warden回调应该放在rails应用程序中的哪个位置?

我对铁杆比较陌生.我有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目录中放置本质上是控制器代码的感觉并不合适.

ruby-on-rails devise warden

20
推荐指数
1
解决办法
6632
查看次数

配置Warden以用于RSpec控制器规范

我能够使用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)

我很感激任何人都可以提供的任何指导.

rspec ruby-on-rails warden ruby-on-rails-3

20
推荐指数
2
解决办法
1万
查看次数

什么是Rails/Devise会话中的监听数据?

Rails会话中的"数据"如下所示:

{"warden.user.user.key" => [[1], "long-random-string"]}
Run Code Online (Sandbox Code Playgroud)

1是用户ID.什么是长随机字符串?

这是由Rails或Devise处理/使用的东西吗?

ruby-on-rails devise warden

20
推荐指数
1
解决办法
6003
查看次数

防止在rails 3.2.2上为RESTful api创建会话

如何防止会话存储在JSON/XML调用上创建会话?

我的问题是我在数据库中保存会话,并在多个api调用中被淹没.

我正在使用Rails 3.2.2和Devise进行身份验证.

session session-storage devise warden ruby-on-rails-3

12
推荐指数
1
解决办法
4231
查看次数

Active Admin身份验证与用户身份验证冲突

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

任何帮助或线索将非常感谢

ruby-on-rails devise warden ruby-on-rails-3.1 activeadmin

11
推荐指数
1
解决办法
8310
查看次数

设计:可记住意味着last_sign_in_at不会被可跟踪更新

我正在使用Devise,并依赖于用户模型的last_sign_in_at来计算我的客户是否在X天内没有返回.但是,我最近发现last_sign_in_at仅在实际的表单登录事件发生时更新,而不是由于包含可记住的用户而自动登录时.

如果想要确保每次用户登录时更新last_sign_in_at(新的浏览器会话),无论他们是使用表单登录还是由可记忆的cookie自动登录,我将如何在设计兼容的方式?

authentication ruby-on-rails devise warden

10
推荐指数
2
解决办法
4763
查看次数