gpt4 book ai didi

ruby-on-rails - 在 Devise on Rails 中使用单独的身份验证模型

转载 作者:数据小太阳 更新时间:2023-10-29 06:44:15 25 4
gpt4 key购买 nike

我有一个简单的解决方案,我自己使用以下对象:

  • Account(有token字段,认证时返回并用于API调用)
  • 身份验证(具有 auth_type/auth_id 和对帐户的引用)

我有一个单独的身份验证模型,可以连接多种登录方式(设备 UUID、电子邮件/密码、twitter、facebook 等)。但似乎在 Devise 的所有示例中,您都在 User (Account) 模型上使用它。

那不是不够灵活吗?例如,OmniAuth 模块在 User 模型上存储提供者和 ID,如果您希望能够从 Twitter 和 Facebook 登录,会发生什么情况?只有一个提供者有空间吗?

我应该在我的Account 模型还是Authentication 模型上使用 Devise?

最佳答案

我最近在做一个项目,在这个项目中我使用 Devise 来为不同的服务保留用户的 token 。情况有点不同,但你的问题仍然让我思考了一会儿。

无论如何,我都会将 Devise 绑定(bind)到 Account 模型。为什么?让我们来看看。

因为我的电子邮件是唯一可以将我识别为用户的东西(并且您指的是 Account 作为用户)我会把它成对地放在 accounts 表中使用密码,以便我最初能够使用基本的电子邮件/密码身份验证。此外,我会将 API token 保存在 authentications 中。

如您所述,OmniAuth 模块需要存储提供者和 ID。如果您希望您的用户能够同时连接到不同的服务(并且出于某种原因您这样做了)那么显然您需要将两个提供者-id 对保存在某个地方,否则一个将简单地每次单个用户进行身份验证时都会被覆盖。这引导我们使用Authentication 模型,该模型已经适用并引用了Account

因此,在查找提供商 ID 对时,您需要检查 authentications 表而不是 accounts。如果找到一个,您只需返回一个与之关联的 account。如果没有,那么您检查是否存在包含此类电子邮件的帐户。如果答案为是,则创建新的authentication,否则创建一个,然后为其创建authentication

更具体地说:

#callbacks_controller.rb
controller Callbacks < Devise::OmniauthCallbacksContoller
def omniauth_callback
auth = request.env['omniauth.auth']
authentication = Authentication.where(provider: auth.prodiver, uid: auth.uid).first
if authentication
@account = authentication.account
else
@account = Account.where(email: auth.info.email).first
if @account
@account.authentication.create(provider: auth.provider, uid: auth.uid,
token: auth.credentials[:token], secret: auth.credentials[:secret])
else
@account = Account.create(email: auth.info.email, password: Devise.friendly_token[0,20])
@account.authentication.create(provider: auth.provider, uid: auth.uid,
token: auth.credentials[:token], secret: auth.credentials[:secret])
end
end
sign_in_and_redirect @account, :event => :authentication
end
end

#authentication.rb
class Authentication < ActiveRecord::Base
attr_accessible :provider, :uid, :token, :secret, :account_id
belongs_to :account
end

#account.rb
class Account < ActiveRecord::Base
devise :database_authenticatable
attr_accessible :email, :password
has_many :authentications
end

#routes.rb
devise_for :accounts, controllers: { omniauth_callbacks: 'callbacks' }
devise_scope :accounts do
get 'auth/:provider/callback' => 'callbacks#omniauth_callback'
end

这应该可以满足您的需求,同时保持您想要的灵 active 。

关于ruby-on-rails - 在 Devise on Rails 中使用单独的身份验证模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647681/

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