5

我有两个设计模型,用户和业务;我希望两者都能够使用单一登录表单登录。我正在使用主干 js,并且我有一个自定义视图,因此该视图不是问题。ajax 请求用于登录,它按预期适用于用户,但不适用于企业。

我搜索了谷歌并遇到了一些提到使用 STI 来解决这个问题的解决方案,但是该项目已经完成了很多,我现在无法做出这样的改变。我正在考虑覆盖 Devise 会话控制器,并且:

  1. 检查给定的电子邮件地址是否为用户,然后使用 Warden 对用户进行身份验证。
  2. 如果未找到使用该电子邮件的用户,则使用 Warden 对业务模型进行身份验证。

我不知道如何更改代码来实现上述功能,我不知道warden是如何工作的,我需要调整哪些参数来实现上述功能,需要调用哪些函数。谁能指出我正确的方向或提供一个我应该如何继续前进的例子。

谢谢。

4

3 回答 3

7

别担心,你没有被卡住。

我认为您最好的选择是覆盖 Devise 的会话控制器并更改会话的“新”和“创建”方法。

所以在你自己的“sessions_controller.rb”中,你会有这样的东西:

class SessionsController < Devise::SessionsController
  # GET /resource/sign_in
  def new
    resource = build_resource(nil, :unsafe => true)
    clean_up_passwords(resource)
    respond_with(resource, serialize_options(resource))
  end

  # POST /resource/sign_in
  def create
    resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_in_path_for(resource)
  end
end

在你的路线中,你会使用类似的东西(取决于你命名你的用户模型):

devise_for :users, :controllers => {
    :sessions => 'sessions'
}


devise_for :businesses, :controllers => {
    :sessions => 'sessions'
}

上面的会话控制器根本没有定制。我不知道你的代码,所以我真的无能为力。但基本步骤是:

  1. 检查auth_optionsresource_name变量以了解它们如何存储数据。
  2. resource如果在用户表中未找到,请添加条件逻辑以更改这些变量。

设计很棒,角色也很棒,但有时只有一个用户模型,甚至使用 STI,都没有意义。因为我在最近的一个项目中处理过这个问题,所以我很快就会就这个确切的问题写一篇更长的文章。

于 2012-09-27T01:38:36.707 回答
5

我最近想出了这个完整的技巧来完成这项工作。我的建议是强烈考虑使用角色的单一用户模型,但这可行——至少在当前版本的 Devise 中是这样。

https://gist.github.com/jeremyw/5319386

如果您像这样进行monkeypatch 或以其他方式覆盖默认行为,请确保您有一个好的测试套件,以防您想尝试升级 Devise。

于 2013-04-06T23:32:38.570 回答
4

考虑仅使用 User 模型并使用CanCanRolify来满足每种类型用户的独特需求。这可能意味着从您的一些代码重新开始,但从长远来看可能更容易维护。

不要只相信我的话。这是一个相关的问题,回答很好。

于 2012-09-24T01:10:15.807 回答