在 Rails 中创建帐户时创建随机、唯一的令牌

2023-12-23

我有一个使用 Devise (最新的)的 Rails 4 应用程序,并尝试为每个用户创建一个随机令牌(如 ID,但更长等)使用this https://stackoverflow.com/questions/6021372/best-way-to-create-unique-token-in-rails回答我能够想出以下代码:

# app/models/model_name.rb
class ModelName < ActiveRecord::Base
  include Tokenable
end

# app/models/concerns/tokenable.rb
module Tokenable
  extend ActiveSupport::Concern

  included do
    before_create :generate_token
  end

  protected

  def generate_token
    self.token = loop do
      random_token = SecureRandom.urlsafe_base64(nil, false)
      break random_token unless self.class.exists?(token: random_token)
    end
  end
end

对于任何给定模型唯一的标记,此代码非常有效。 IE。所有用户都将拥有唯一的令牌,所有管理员都将拥有唯一的令牌。但管理员可能拥有与用户相同的令牌 - 这种行为是不受欢迎的。

有没有一种优雅的方法,可以将令牌抽象到自己的模型中并使用“has_one”关系来确保令牌不存在于它所属的所有模型中?

(我想我可以硬编码unless (User.exists? ... or Admin.exists? ... )进入除非子句,尽管这看起来很庞大。)

任何想法或建议表示赞赏!谢谢!


Rails 5 带来了一个新功能has_secure_token真的很容易使用:

# Schema: User(token:string, auth_token:string)
class User < ActiveRecord::Base
    has_secure_token :auth_token
end

user = User.new
user.save
user.auth_token # => "pX27zsMN2ViQKta1bGfLmVJE"
user.regenerate_auth_token # => true

由于 Rails 5 尚未发布,您可以使用 Backport有_安全_令牌 http://github.com/robertomiranda/has_secure_token gem

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

在 Rails 中创建帐户时创建随机、唯一的令牌 的相关文章

随机推荐

  • Linux内核与用户空间程序之间的通信

    我目前正在编写一个 Linux 内核模块 在实现与用户空间程序的通信时遇到问题 该内核模块需要接收用户空间程序发出的任务 并在完成后将结果发送回用户空间程序 当内核模块正在执行其工作时 用户空间程序应该被阻止 我认为内核 用户空间 IPC
  • 如何计算 0 到 360 之间的色调值的平均值和标准差?

    假设使用简单的 HSV 颜色模型获取 5 个色调样本 其值为 355 5 5 5 5 所有色调均为红色 并且就感知而言彼此 相邻 但简单平均值为 75 远离 0 或 360 接近黄绿色 计算这个平均值和相关标准差的更好方法是什么 简单的解决
  • iOS 和红外线

    是否可以使用 iOS iPhone 或 iPad 与红外设备 USB 红外 电视 手机等 通信 嗯 我知道这是可能的 因为 AppStore 中有很多远程 通用远程应用程序 我主要想知道如何 有什么限制和 要求 什么样的附加硬件 必需的 如
  • System.currentTimeMillis() 和 Date getTime() 之间的区别?

    我希望从对返回时间戳的函数的多次调用中获得微小的性能增益 该函数如下所示 public static long get now ms returns number of MILLISECONDS since epoch java util
  • 挂钩标准 Inno Setup 复选框

    我添加了一个用于选择任务的InputOptionWizardPage 这工作正常 但我想添加一些自定义功能 一个任务依赖于另一个任务 因此如果选中第二个复选框 则应选中第一个复选框并将其灰显 为此 我需要访问复选框的属性 我找到了使用完全自
  • 如何为使用 SCons 构建的程序内置 gprof 支持?

    问候 这是我的 SConstruct 文件 env Environment env Append CCFLAGS g pg env Program target program1 source program1 c 这也是编译的输出 sco
  • 尝试使用 Google OAuth 2.0 登录混合流时出错(Google_IO_Exception',消息为“HTTP 错误:无法连接:'0'”)

    我正在尝试使用服务器端混合流程实现 使用 G 登录 按钮 但我不断收到相同的错误 Google IO Exception with message HTTP Error Unable to connect 0 我到处都看过 什么都试过了 但
  • Vertica 中每组查询的前 N ​​个

    这是一个老问题 在Vertica中寻找最佳解决方案 想象一个有列的表格 A B C D E A D 列是 int 或 varchar E 列是 timestamptz 列 其默认值为 GETUTCDATE 表格内容示例 1 2 AAA 4
  • 如何获取变量的类型?并实例化它?

    我正在尝试创建一个打开窗口但确保同一窗口尚未打开的函数 我希望能够向它传递一个非实例化的 var 或一个实例化的 var 并且它可以以任何方式工作 如果窗口已经打开 它将关闭它然后重新打开它 所以我需要一种方法来传递 Window 类型的变
  • 模糊文件差异

    我可以找到一些有关模糊搜索的资源 但没有找到有关模糊文件 字符串比较的资源 有没有什么方法可以比较文件 同时忽略简单的差异 例如日期和电子邮件地址 我正在考虑一个可以传递 2 个字符串和一个正则表达式列表的函数 工具 返回结果将是一个差异列
  • Android 4.4.4 上的 FlexJson ClassNotFound 异常

    我有一个适用于 Android 设备的 multidex 项目 我使用 Flexjson 我已经使用 flexjson 3 3 和 2 x 对其进行了测试 它在 Android 5 x 中运行良好 但在 Android 4 4 4 中崩溃
  • 通过一个网络接口进行 Http 请求

    我想仅在选定的网络接口上调用剩余 Web 服务的 HTTP 请求 对此的任何建议将不胜感激 我发现你可以像这样在 url 中定义网络接口 192 168 1 122 eth0 它可以在 Ubuntu 中运行 我希望它也可以在不同的系统中运行
  • 资源解释为图像,但使用 MIME 类型 text/html、curl、php 进行传输

    我收到此错误 这是我以前从未见过的 我正在使用 cURL 尝试从我的网站获取验证码图像 但我收到此错误而不是我想要的图像 if isset GET captcha curl gt open GET https mydomain com cu
  • 在同一 svn-remote 中初始获取后添加 git 分支

    我正在使用 git svn 来处理 svn 存储库 我不想要整个存储库 因为它包含很多遗留内容 其中包含二进制文件 我只跟踪一些目录 这是我目前的 git config 工作正常 core repositoryformatversion 0
  • 使用react-native裁剪图像

    你好世界 我尝试裁剪图像 如上的解释React native 文档 https facebook github io react native docs images html source as an object
  • 共享元素转换(前台/后台)问题

    我想知道是否可以更改共享元素过渡的 z 顺序 看 我有一个带有图像的布局 它填满整个屏幕 图像前面是一个文本框 显示图像的标题 如果我单击文本框 则会开始过渡到详细信息活动 因此 我实现了一个共享元素过渡 其中全屏图像在详细视图中动画化为自
  • Python 虚拟环境最终会使用比创建它的版本更旧的 PIP...为什么以及如何解决此版本控制问题?

    我的问题与另一个被问到的问题类似Python3 https stackoverflow com questions 29689514 why python3 m venv myenv installs older version of pi
  • 如何实施混凝土红青浮雕眼镜显示器的红色和青色校准程序?

    我正在开发一个用于治疗儿童的应用程序 它必须为左眼和右眼显示不同的图像 我决定使用廉价的红青色眼镜来分离眼睛的视野 第一只眼睛只能看到红色图像 第二只眼睛只能看到青色图像 问题是显示器上的颜色并不是真正的红色和青色 而且眼镜也不是理想的 我
  • 线程中的 Stop() 方法?

    在下面的例子中如何stop 方法实现了 应该做什么而不是使用stop method 在我看来 当所需的状态被挂起时 线程等待使用Object wait 当线程恢复时 会使用以下命令通知目标线程Object notify 但在实施的情况下值得
  • 在 Rails 中创建帐户时创建随机、唯一的令牌

    我有一个使用 Devise 最新的 的 Rails 4 应用程序 并尝试为每个用户创建一个随机令牌 如 ID 但更长等 使用this https stackoverflow com questions 6021372 best way to