Ruby on rails 设计-多用户单点登录表单

Ruby on rails 设计-多用户单点登录表单,ruby-on-rails,ruby-on-rails-3,devise,warden,Ruby On Rails,Ruby On Rails 3,Devise,Warden,我有两个设计模型,用户模型和业务模型;我希望两者都能够使用单一登录表单登录。我使用的是主干js,我有一个定制的视图,因此视图不是一个问题。ajax请求用于登录,它按预期为用户工作,但不适用于企业 我搜索过谷歌,发现一些解决方案提到使用STI来解决这个问题,但是这个项目已经完成了很多,我现在不能做这样的改变。我的思路是覆盖Desive sessions控制器,并: 检查给定的电子邮件地址是否为用户,然后使用Warden对该用户进行身份验证 如果找不到具有该电子邮件的用户,则使用Warden向业务模

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

我搜索过谷歌,发现一些解决方案提到使用STI来解决这个问题,但是这个项目已经完成了很多,我现在不能做这样的改变。我的思路是覆盖Desive sessions控制器,并:

  • 检查给定的电子邮件地址是否为用户,然后使用Warden对该用户进行身份验证
  • 如果找不到具有该电子邮件的用户,则使用Warden向业务模型进行身份验证
  • 我不知道如何更改代码来实现上述功能,我不知道warden是如何工作的,我需要调整哪些参数来实现上述功能,需要调用哪些函数。有谁能给我指出正确的方向,或者举个例子说明我应该如何推进这项工作


    谢谢。

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


    不要相信我的话

    别担心,你没有被卡住

    我认为您最好的选择是覆盖Desive的会话控制器,并更改会话的“new”和“create”方法

    因此,在您自己的“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
    
    上述会话控制器完全不是自定义的。我不知道你的密码,所以我帮不了你。但基本步骤是:

  • 检查
    auth_选项
    resource_name
    变量,了解它们是如何存储数据的
  • 如果在用户表中找不到
    资源
    ,请添加条件逻辑以更改这些变量

  • Desive很棒,角色也很棒,但有时只有一个用户模型,甚至使用STI都没有意义。由于我在最近的一个项目中处理过这个问题,我很快就要就这个问题写一篇更长的文章。

    我最近想出了一个完全可行的方法。我的建议是强烈地考虑一个具有角色的单用户模型,但是这是有效的——至少与当前版本的设计一致。p>


    如果您使用monkeypatch或以其他方式覆盖这样的默认行为,请确保您有一个良好的测试套件,以防您试图升级Desive。

    我同意。现在就去“角色”的方式,在过多的时间过去之前,项目需要第三个模型。如果您包含相关的源代码,并提供链接作为进一步的参考,则会更好。设计操作已经完成。确保您从正在使用的版本复制操作,然后更改
    resource\u name
    ,以匹配您想要登录的用户类型(即
    :business
    )。嘿,伙计,您曾经发表过那篇博文吗?@hamstar-不,我没有。事实上,我对Desive越来越厌倦,于是推出了自己的解决方案。你有什么问题吗?我很乐意回答任何问题(假设我知道答案)。@Bryce我最终只是为了我的解决方案而覆盖了Deisages的内容,但如果你将其公开,我会对你自己的解决方案感兴趣。干杯。@hamstar-基本上,我创建了一个名为UserAccount的模型,它保存了所有可验证用户的身份验证信息。然后,我的不同类型的用户(用户、业务等)都有一个子用户帐户模型。然后,所有登录等都只是通过与UserAccount模型一起工作的控制器运行,所以任何用户类型都可以使用它们。
    devise_for :users, :controllers => {
        :sessions => 'sessions'
    }
    
    
    devise_for :businesses, :controllers => {
        :sessions => 'sessions'
    }