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

2024-03-06

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

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

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

那不是灵活性比较差吗?例如 OmniAuth 模块将提供者和 id 存储在User模型中,如果您希望能够从 Twitter 和 Facebook 登录,但只有一个提供商的空间,会发生什么情况?

我应该在我的设备上使用 DeviseAccount模型或验证 model?


最近我正在从事一个项目,其中我使用 Devise 来保存不同服务的用户令牌。情况有点不同,但你的问题仍然让我思考了一段时间。

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

由于我的电子邮件是唯一可以识别我作为用户的信息(并且您指的是Account作为用户)我会把它放在accounts表与密码配对,以便我最初能够使用基本的电子邮件/密码身份验证。我还将 API 令牌保留在authentications.

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

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

更具体:

#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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Devise on Rails 中使用单独的身份验证模型 的相关文章

随机推荐

  • MPI:MPICH2 在 Windows 局域网中安装和编程

    我正在学习MPI 我遵循的第一个教程是here http curveto blogspot in search label Parallel 我在 Windows 7 上使用 MSVC 2010 成功运行的代码是 include mpi h
  • 浏览器支持以双斜杠开头的 URL

    我最近看到一些没有协议的链接 它看起来并不太难理解 我认为这是一个好主意并且非常直观 对于那些不知道的人 请使用类似的 URL example com script js将指向任一http example com script js or
  • 通过反射使用字符串值设置属性

    我想通过反射设置对象的属性 其值为 typestring 因此 举例来说 假设我有一个Ship类 其属性为Latitude 这是一个double 这是我想做的 Ship ship new Ship string value 5 5 Prop
  • 无法连接到远程虚拟机。连接被拒绝。尝试在 Flash Builder 4.7 中调试远程 java 应用程序时

    在某一时刻 远程调试曾经发挥过作用 但对于我的一生 我似乎无法弄清楚是什么破坏了它 我有一个 Flex Java 应用程序 有一个启动 tomcat 服务器的包装器 我修改了wrapper conf文件以包含 Xdebug Xrunjdwp
  • 当波浪号出现在表达式之前时,它有什么作用?

    var attr input textarea indexOf target tagName toLowerCase value innerHTML 我在一个答案里看到过 以前没见过 这是什么意思 is a 翻转其操作数中的所有位 例如 如
  • “pick”函数的 TypeScript 通用类型(结果对象值类型)

    在编写 pick 函数的类型时遇到问题 当仅选择一个键或具有相同类型值的多个键时 一切正常 但是 如果我尝试选择几个键并且它们的值是不同类型 我会收到错误 不太确定我在哪里犯了错误 感谢您的时间 export interface Mappe
  • 传单地图单击更改颜色,然后再次单击时删除

    我正在使用 Leaflet 制作美国地图 并且具有单击功能来放大和更改州的颜色 这可行 但我不能 单击另一个状态时使颜色返回到之前的颜色 目前 每次我点击一个状态 颜色就会改变 并且不会删除之前的颜色变化 这是我的代码 var map L
  • Python - 使用utf-8编码读取和写入csv文件

    我正在尝试读取一个 csv 文件 其标头包含外来字符 并且我遇到了很多问题 首先 我使用简单的 csv reader 读取文件 filename C Users yuval Desktop new resources mk str mkNu
  • 内联表单,缩小以使标签适合左侧

    标题说标签是因为这是我的用例 但显然它可以是任何元素 我想要实现的是以下表单布局 label input another label input third label input 目前我的 HTML 大致如下 省略细节 div overf
  • 将音频样本从 Float32 移位到 SInt16 会导致严重削波

    我对 iOS 及其 C 基础很陌生 但对一般编程并不熟悉 我的困境是这样的 我正在基于复杂 AudioUnits 的应用程序中实现回声效果 该应用程序需要混响 回声和压缩等 但是 只有当我使用特定的时 回声才能正常工作音频流基本描述我的应用
  • 如何保护 Java/Javafx 代码不被最终用户看到?

    我一个人在一家公司做一个项目已经两年多了 该项目是一个非常大的项目 使用 rxtx 与硬件设备进行通信 我使用 Java 8 和 JAVAFX 作为 UI 现在它几乎完成了 我开始搜索如何交付公司将分发给其客户的最终用户应用程序 问题是 我
  • ValueError:字段 admin.LogEntry.user 是使用惰性引用声明的

    我正在开发一个新的 django 项目并坚持迁移 我想创建一个 UserModel 为了做到这一点 到目前为止我做了两件事 1 我制作了AuthUser模型并在下面的类中设置了一个Meta类 In 模型 py class AuthUser
  • safari - jquery - ajax 500 内部服务器错误

    我创建了一个 jquery ajax 调用 它在 Chrome firefox 和 IE 中运行良好 与 Safari 一样 它在响应中给出 500 内部服务器错误 我认为这可能是由于服务器异常所致 但是当我尝试调试时 我发现它根本没有到达
  • SSDT 架构比较锁 SET QUOTED_IDENTIFIER 为 OFF

    我安装了 Visual studio 2012 并安装了 SSDT 版本 11 1 20627 0 一直困扰我的问题之一是 SSDT 项目中的所有存储过程 当尝试使用模式比较将其推送到服务器时 SP 的 SET QUOTED IDENTIF
  • 使用动态规划求解背包

    我正在使用我在此链接中找到的算法来实现背包问题的片段背包问题 http www es ele tue nl education 5MC10 Solutions knapsack pdf I have also attached the sn
  • 无法运行地图示例

    我正在尝试运行谷歌地图例如 但它一直在控制台中给我 WARNING Application does not specify an API level requirement Device API version is 7 Android
  • “单一分配”对于 boost::make_shared 意味着什么

    在boost文档中make shared http www boost org doc libs 1 47 0 libs smart ptr make shared html 它说 除了方便和风格之外 这样的功能还具有异常安全性和显着性 更
  • Spring 类级别验证和 Thymeleaf

    我正在学习 Spring 框架和 Thymeleaf 我已经知道如何使用类似的东西来显示字段错误 fields errors xx 但是 我对如何在 Thymeleaf 中显示对象错误消息感到困惑 这是我的UserForm class Pa
  • Cocoa 与 MacOS X 钥匙串的接口

    我有一些 Mac 代码需要存储 访问和更新密码 以便将用户与 Web API 连接起来 放置这些信息的正确位置应该是 Mac Keychain 但似乎没有 cocoa 界面 请参阅这个答案 https stackoverflow com a
  • 在 Devise on Rails 中使用单独的身份验证模型

    我有一个简单的解决方案 我用以下对象自己制作 Account 具有 token 字段 在身份验证时返回并在 API 调用中使用 验证 具有 auth type auth id 和对帐户的引用 我有一个单独的验证模型能够连接多种登录方式 设备