我正在使用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的预期功能(需要一个特定的控制器来创建会话),所以我不想保留它.我想知道这种约束是安全措施还是只是一种约定 - 如果是为了安全,这可能是非常糟糕的.
我有一个使用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?
条件控制的链接)
我的问题:是否有其他人遇到过这种不可靠性以及如何减轻这种不可靠性?
我有一个资源,其中新操作需要用户登录才能查看.如果用户尝试在未登录的情况下创建新资源,则会将其重定向(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中那样表现.将用户重定向到登录页面?
谢谢.
我希望构建一个基于Scalatra的API.其中一项要求是OAuth身份验证.我注意到OAuth的指南尚未在Scalatra官方网站上发布.通过弄清楚如何将基于OAuth的策略添加到Warden中,目前是添加OAuth支持的最佳方式吗?我来自Ruby on Rails的背景,因此很多Scala/Java约定都是新的.可能有几种方法可以解决这个问题,但是我希望有任何解决方案可以在我自己的应用程序中进行实施.
我想实时制作我的应用程序
这是我的错误
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
我不知道该怎么办
请帮帮我.
我想创建一个用于访问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
我无法辨别为什么我的应用程序返回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) 我正在使用Sinatra构建API(为客户端使用Angular并希望其他人可以访问API)并使其成为OAuth提供者.我想知道最好的路线是什么(解决现有的宝石或从Warden或其他东西推出自己的解决方案).
在使用Rails之前,已经使用了设计和门卫进行身份验证和oauth,想知道什么是Sinatra的最佳解决方案.
理想情况下,我不希望视图或能够扩展/修改现有解决方案的操作,因为我只是作为API与它进行交互.
用户登录(ENV['warden'].authenticate!
'd)一次后,如何warden
知道这一点?除了值之外,我在 cookie 中找不到任何内容rack.session
- 我无法从文档或代码中弄清楚这一点。
我遇到了一个问题,我的法拉第一直超时。我不知道是什么问题。我真的需要一些帮助。重定向失败。我不确定是什么导致了这个问题。我已经尝试解决这个问题整整 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)