gpt4 book ai didi

ruby-on-rails - 您如何为设计 user_signed_in 添加额外的范围? helper ?

转载 作者:行者123 更新时间:2023-12-04 05:52:25 24 4
gpt4 key购买 nike

我有需要独立的身份验证:

subdomain1.domain.com
subdomain2.domain.com
等等

现在使用设备 user_signed_in?助手 - 如果有人在 subdomain1 上进行身份验证,它正在 subdomain2 上工作。我想添加一个tenant_id 范围来防止这种情况发生。

我已经能够在我的模型中使用以下方法对登录身份验证执行此操作:

def self.find_for_database_authentication(warden_conditions)
where(:email => warden_conditions[:email], :tenant_id => warden_conditions[:tenant_id]).first
end

但我不清楚如何在登录检查中执行此操作。

谢谢!

最佳答案

为此,您需要将身份验证范围缩小到子域。

这是 Docs有关如何完成此操作的页面。我将在此处添加以供引用:

概述

  • 修改设计生成的迁移以删除电子邮件唯一性约束索引
  • 更改登录 key 以包括 :subdomain
  • 覆盖设计 Hook 方法 find_for_authentication

  • 修改迁移

    首先,您必须删除电子邮件索引唯一性约束。因为我们将把它变成一个范围查询,我们将新索引的范围限定为子域。如果这是全新的 Devise 模型,您可以打开 Devise 迁移并更改以下内容:
    # db/migrate/XXX_devise_create_users.rb
    def change
    # Remove this line
    add_index :users, :email, :unique => true

    # Replace with
    add_index :users, [:email, :subdomain], :unique => true
    end

    如果这是一个现有项目,您需要创建一个新的迁移删除旧索引并添加一个新索引:
    rails g migration reindex_users_by_email_and_subdomain


    # db/migrate/XXX_reindex_users_by_email_and_subdomain.rb
    def change
    remove_index :users, :email
    add_index :users, [:email, :subdomain], :unique => true
    end

    更改登录 key

    在您的设计模型中,添加 :subdomain:request_keys .默认 :request_keys设置为 [] .
       # app/models/user.rb
    class User
    devise :database_authenticatable, :registerable,
    :recoverable, :rememberable, :trackable, request_keys: [:subdomain]
    end

    如果您有多个 Devise 模型并且您希望它们都具有相同的 :request_keys 配置,您可以在 config/initializers/devise.rb 中全局设置它
    config.request_keys = [:subdomain] # default value = []

    如果您还想使用不带子域的 URL 登录, :request_keys还可以采用带有 bool 值的哈希值,指示是否需要 key 。
    config.request_keys = { subdomain: false }

    检查您是否没有 :validatable在模型 的设计调用中

    如果这样做, :validatable 将阻止多个记录具有相同的电子邮件,即使在不同的子域中也是如此。如果你想保留一些验证,你可以从 https://github.com/plataformatec/devise/blob/master/lib/devise/models/validatable.rb 复制你想要的。

    覆盖 Devise auth finder hook

    对于 Authenticatable,Devise 使用钩子(Hook)方法 Model.find_for_authentication。覆盖它以包含您的其他查询参数:
    # app/models/user.rb
    class User < ActiveRecord::Base
    def self.find_for_authentication(warden_conditions)
    where(:email => warden_conditions[:email], :subdomain => warden_conditions[:subdomain]).first
    end
    end

    恭喜,用户登录现在仅限于子域!

    关于ruby-on-rails - 您如何为设计 user_signed_in 添加额外的范围? helper ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34890049/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com