7

我正在运行带有 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

由于. valid_controller?_ Devise::Strategies::Authenticatable因为我已将默认控制器 ( devise/sessions) 作为用户的映射控制器,所以它不允许来自我的自定义控制器的身份验证。

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

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

更新

这是一个糟糕的临时解决方法。我不喜欢它,所以我不会将其发布为答案,但我认为它可能会为所有回答者类型提供思考:

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

Devise.mappings[:user].controllers[:sessions] = params[:controller]

这是围绕设计的预期功能(需要一个特定的控制器来创建会话),所以我不想保留它。我想知道这个约束是一种安全措施还是只是一种约定——如果是为了安全,这可能是相当糟糕的。

4

2 回答 2

1

我只能建议另一种解决方法(可能不那么糟糕?)在初始化程序中,您可以覆盖#valid_controller?,如下所示:

require 'devise/strategies/authenticatable'
require 'devise/strategies/database_authenticatable'

class Devise::Strategies::DatabaseAuthenticatable
  def valid_controller?
    # your logic here
    true
  end
end

我也有兴趣知道这种约束的原因

于 2011-05-28T10:13:11.013 回答
0

我将 Devise 2.2.7 与 Rails 3.2.13 一起使用。上述两种方法都对我不起作用:valid_vontroller?方法 inDevise::Strategies::DatabaseAuthenticatable不再存在。这个Devise.mappings[:user].controllers[:sessions]技巧对我也不起作用。

在挖掘了这个线程后,我发现了 valid_params_request? 它负责确保请求应该通过身份验证系统发送。有一个辅助方法,allows_params_authentication!,这使Devise::SessionsController能够处理身份验证请求。

您可以通过以下方式对来自任何控制器的用户进行身份验证:

def signin
  allow_params_authentication!
  authenticate_user!
end

如果您想在身份验证失败时重定向到自定义页面:

resource = warden.authenticate!({
  :scope => :user,
  :recall => "#{controller_path}#login"
})
sign_in(:user, resource)

通过开发与 Spree Commerce 一起工作的引擎,我遇到了在子类之外处理身份验证的需要Devise::SessionsController,Spree Commerce 已经实现了设计身份验证。

于 2013-12-18T23:18:02.663 回答