标签: warden

设计:让多个控制器处理用户会话

我正在使用rails 3.0.7运行设计1.3.4.用户可以通过两种方式登录:使用网络应用,使用移动网络应用(通过JSON API调用).第一种方法由默认设备会话控制器完美处理.API调用的身份验证方法需要在扩展我的控制器中Api::BaseController.所以,我写了第二个这样的控制器:

class Api::UserSessionsController < Api::BaseController
  …
  def create
    user = warden.authenticate(:scope => :user)
    if user
      sign_in(:user, user)
    else
      # Do some error handling
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

试图通过这种方法登录失败,由于valid_controller?在法Devise::Strategies::Authenticatable.因为我已将默认控制器(devise/sessions)作为用户的映射控制器,所以它不允许从我的自定义控制器进行身份验证.

我想将我的自定义功能推送到我自己的子类中Devise::SessionsController,但是我需要 API会话控制器来扩展它API::BaseController,所以我也无法扩展Devise::SessionsController.我不想在API控制器中放置工作的,默认行为的web-app身份验证方法,特别是因为这需要从设计控制器复制它们.

有什么建议?是否有一些我缺少的配置允许多个控制器处理会话?该valid_controller?方法进行==比较,而不是.include?,所以我不知道这将如何工作.

UPDATE

这是一个可怕的临时解决方法.我不喜欢它,所以我不是把它作为答案发布,但我认为它可能会为你所有的回答者类型提供食物思考:

在我的create方法的顶部,我可以覆盖Devise期望的会话控制器.

Devise.mappings[:user].controllers[:sessions] = params[:controller]
Run Code Online (Sandbox Code Playgroud)

这正在解决Devise的预期功能(需要一个特定的控制器来创建会话),所以我不想保留它.我想知道这种约束是安全措施还是只是一种约定 - 如果是为了安全,这可能是非常糟糕的.

authentication devise warden ruby-on-rails-3

7
推荐指数
1
解决办法
2697
查看次数

与Devise和rspec的Rails 3:Warden测试助手不可靠

我有一个使用rails 3.2和Devise的应用程序.我有一个使用rspec和Capybara的请求测试套件.

我试图在我的登录帮助中转而使用Warden测试助手,而不是让Capybara填写登录表单并提交.由于我的测试套件的大小和复杂性,这导致我的测试运行时节省超过一分半.

在我的配置是:

RSpec.configure do |config|
  config.include Warden::Test::Helpers, :type => :request
  config.after :each do
    Warden.test_reset!
  end
end
Run Code Online (Sandbox Code Playgroud)

并在上下文中:

let!(:current_user) { FactoryGirl.create(:user) }

background do
  login_as(current_user, :scope => :user)
end
Run Code Online (Sandbox Code Playgroud)

但是,当使用这些配置运行测试套件时,几乎每个测试运行都会有一个不同的随机失败的请求规范,因为页面呈现就好像用户没有登录一样.(具体来说,由user_signed_in?条件控制的链接)

我的问题:是否有其他人遇到过这种不可靠性以及如何减轻这种不可靠性?

ruby rspec ruby-on-rails devise warden

7
推荐指数
1
解决办法
2186
查看次数

在功能Rails测试中为authenticate_user抛出warise warden错误

我有一个资源,其中新操作需要用户登录才能查看.如果用户尝试在未登录的情况下创建新资源,则会将其重定向(302'd)到登录页面.我的功能测试如下:

  test "should not get new unless logged in" do
    get :new
    assert_response :redirect
  end
Run Code Online (Sandbox Code Playgroud)

stacktrace看起来像这样:

ArgumentError: uncaught throw :warden
    /.../gems/warden-1.1.1/lib/warden/proxy.rb:114:in `throw'
    /.../gems/ruby-1.9.2-p318/gems/warden-1.1.1/lib/warden/proxy.rb:114:in `authenticate!'
    /.../gems/ruby-1.9.2-p318/gems/devise-2.0.4/lib/devise/controllers/helpers.rb:48:in `authenticate_user!'
Run Code Online (Sandbox Code Playgroud)

在新操作之前,我有一个before_filter到authenticate_user.

我理解为什么authenticate_user!失败但我无法理解为什么它会抛出一个错误.不应该只是像在webapp中那样表现.将用户重定向到登录页面?

谢谢.

functional-testing devise warden ruby-on-rails-3

7
推荐指数
2
解决办法
6251
查看次数

将OAuth添加到Scalatra Web服务

我希望构建一个基于Scalatra的API.其中一项要求是OAuth身份验证.我注意到OAuth的指南尚未在Scalatra官方网站上发布.通过弄清楚如何将基于OAuth的策略添加到Warden中,目前是添加OAuth支持的最佳方式吗?我来自Ruby on Rails的背景,因此很多Scala/Java约定都是新的.可能有几种方法可以解决这个问题,但是我希望有任何解决方案可以在我自己的应用程序中进行实施.

scala oauth warden scalatra

7
推荐指数
1
解决办法
572
查看次数

如何使用带有设计的rails 5中的Aplication.renderer.render

我想实时制作我的应用程序

这是我的错误

ActionView :: Template :: Error(Devise无法Warden::Proxy在您的请求环境中找到该实例.请确保您的应用程序正在按预期加载Devise和Warden,并且Warden::Manager中间件存在于您的中间件堆栈中.如果您在其中一个上看到你的测试,确保你的测试要么正在执行Rails中间件堆栈,要么你的测试正在使用Devise::Test::ControllerHelpers模块request.env['warden']为你注入对象.)
1:-if user_signed_in?
2:.ui.popup.computer {id:"post#{post.id} user#{post.user.id}",style:"padding:0px"}
3:.ui.card
4:.image

我不知道该怎么办

请帮帮我.

ruby-on-rails render real-time devise warden

7
推荐指数
2
解决办法
1157
查看次数

设计忽略我的自定义策略

我想创建一个用于访问API的自定义身份验证策略.我按照Devise中的示例代码忽略了自定义策略.

问题是有效吗?我的Api策略中的方法永远不会运行(基于试图撬开它).

我的代码:

module Devise
  module Strategies
    class Api < Devise::Strategies::Base
      def valid?
        binding.pry
        params[:request_source] == 'api'
      end

      def authenticate!
        #do stuff here

        if user
          success!(user)
        else
          warden.custom_failure!
          render :json=> {:success=>false, :message=>"Error with your login or password"}, :status=>401
        end
      end
    end

    Warden::Strategies.add(:api, Devise::Strategies::Api)

  end
end
Run Code Online (Sandbox Code Playgroud)

并在设计初始化程序中:

config.warden do |manager|
  manager.default_strategies.unshift :api
end
Run Code Online (Sandbox Code Playgroud)

无论我做什么,似乎Devise总是使用其默认策略.AFAIK,这应该够了......

- - - -编辑 - - - -

我在我的设计初始化程序的顶部需要这样的策略:

require Rails.root.join('app/devise/strategies/api')
Run Code Online (Sandbox Code Playgroud)

我知道策略是在启动时加载的,因为如果我在类中放入一个pry调用,它将启动一个pry会话.但是方法内部的Pry调用永远不会运行.:-S

ruby-on-rails devise warden

6
推荐指数
1
解决办法
2430
查看次数

rails专门针对特定页面设计401

我无法辨别为什么我的应用程序返回401 Unauthorized.我的机构控制器中的其他操作在没有登录的情况下正常工作.但是,这个和另一个页面返回401.如果登录,这些页面工作得非常好,但它们不应该要求登录.我甚至已经这样做了至于清空视图和动作,但页面仍然返回401.当通过fiddler调试时,我只是收到302重定向.

我尝试过在其他地方进行研究,并尝试过Warden认证的解决方案,召回401 Unauthorized但没有成功.

安慰

Started GET "/institutions/3" for 127.0.0.1 at 2013-04-25 14:38:15 -0400
    Processing by InstitutionsController#show as HTML
      Parameters: {"id"=>"3"}
      ?[1m?[36mInstitution Load (0.0ms)?[0m  ?[1mSELECT `institutions`.* FROM `institutions` WHERE `institutions`.`id` = 3 LIMIT 1?[0m

Load data...
Load assets...
Run Code Online (Sandbox Code Playgroud)

然后我提交表单,方法设置为GET

Started GET "/visit/schedule/preview?utf8=%E2%9C%93&selected_ids=4693" for 127.0.0.1 at 2013
-04-25 14:28:53 -0400
Processing by InstitutionsController#previewselectedvisits as HTML
  Parameters: {"utf8"=>"?", "selected_ids"=>"4693"}
Completed 401 Unauthorized in 0ms

Started GET "/users/sign_in" for 127.0.0.1 at 2013-04-25 14:28:53 -0400
Processing by Devise::SessionsController#new as HTML …
Run Code Online (Sandbox Code Playgroud)

devise http-status-code-401 warden ruby-on-rails-3

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

Sinatra REST API应用程序的身份验证

我正在使用Sinatra构建API(为客户端使用Angular并希望其他人可以访问API)并使其成为OAuth提供者.我想知道最好的路线是什么(解决现有的宝石或从Warden或其他东西推出自己的解决方案).

在使用Rails之前,已经使用了设计和门卫进行身份验证和oauth,想知道什么是Sinatra的最佳解决方案.

理想情况下,我不希望视图或能够扩展/修改现有解决方案的操作,因为我只是作为API与它进行交互.

ruby authentication oauth sinatra warden

6
推荐指数
1
解决办法
5339
查看次数

Warden 如何从机架会话中获取当前用户?

用户登录(ENV['warden'].authenticate!'d)一次后,如何warden知道这一点?除了值之外,我在 cookie 中找不到任何内容rack.session- 我无法从文档或代码中弄清楚这一点。

ruby devise warden

6
推荐指数
0
解决办法
3274
查看次数

法拉第::错误::超时错误(超时::错误):

我遇到了一个问题,我的法拉第一直超时。我不知道是什么问题。我真的需要一些帮助。重定向失败。我不确定是什么导致了这个问题。我已经尝试解决这个问题整整 4 天了,但似乎没有任何效果。关于法拉第的文档很少,所以我希望有人以前见过这个。

有人可以帮助解决这个错误吗?需要更多信息吗?

Faraday::Error::TimeoutError (Timeout::Error):
/usr/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill'
/usr/lib/ruby/1.9.1/net/protocol.rb:140:in `rbuf_fill'
/usr/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil'
/usr/lib/ruby/1.9.1/net/protocol.rb:132:in `readline'
/usr/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line'
/usr/lib/ruby/1.9.1/net/http.rb:2551:in `read_new'
/usr/lib/ruby/1.9.1/net/http.rb:1319:in `block in transport_request'
/usr/lib/ruby/1.9.1/net/http.rb:1316:in `catch'
/usr/lib/ruby/1.9.1/net/http.rb:1316:in `transport_request'
/usr/lib/ruby/1.9.1/net/http.rb:1293:in `request'
rest-client (1.6.7) lib/restclient/net_http_ext.rb:51:in `request'
/usr/lib/ruby/1.9.1/net/http.rb:1286:in `block in request'
/usr/lib/ruby/1.9.1/net/http.rb:745:in `start'
/usr/lib/ruby/1.9.1/net/http.rb:1284:in `request'
rest-client (1.6.7) lib/restclient/net_http_ext.rb:51:in `request'
faraday (0.8.4) lib/faraday/adapter/net_http.rb:74:in `perform_request'
faraday (0.8.4) lib/faraday/adapter/net_http.rb:37:in `call'
faraday (0.8.4) lib/faraday/request/url_encoded.rb:14:in `call'
faraday (0.8.4) lib/faraday/connection.rb:226:in `run_request'
oauth2 (0.8.0) lib/oauth2/client.rb:88:in `request'
oauth2 (0.8.0) lib/oauth2/client.rb:131:in `get_token'
oauth2 (0.8.0) lib/oauth2/strategy/auth_code.rb:29:in `get_token'
omniauth-oauth2 (1.1.0) lib/omniauth/strategies/oauth2.rb:100:in `build_access_token'
omniauth-oauth2 (1.1.0) …
Run Code Online (Sandbox Code Playgroud)

ruby oauth warden ruby-on-rails-3 faraday

5
推荐指数
1
解决办法
7260
查看次数