我正在运行带有 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]
这是围绕设计的预期功能(需要一个特定的控制器来创建会话),所以我不想保留它。我想知道这个约束是一种安全措施还是只是一种约定——如果是为了安全,这可能是相当糟糕的。