Rails 应用程序使用 Devise 时使用 session_id 和 Remember_user_token 的区别

2024-01-22

我正在使用 Devise-1.5.4 和 Rails 3.0.20。以下是我所了解的事实:

  1. 浏览器有一个session_id的Cookie,它可以帮助普通应用程序唯一地跟踪会话。可能有也可能没有用户登录。
  2. 如果用户已登录(并假设他选择了 Remember_me),则浏览器中还会有另一个用于 Remember_user_token 的 Cookie。
  3. 在我的应用程序中,我使用(设计提供的)方法,例如current_user https://github.com/plataformatec/devise/blob/v1.5/lib/devise/controllers/helpers.rb#L55, authenticate_user! https://github.com/plataformatec/devise/blob/v1.5/lib/devise/controllers/helpers.rb#L46验证用户。
  4. 上述方法调用authenticate! https://github.com/plataformatec/devise/blob/v1.5/lib/devise/strategies/rememberable.rb#L19,它本身称为serialize_from_cookie https://github.com/plataformatec/devise/blob/v1.5/lib/devise/models/rememberable.rb#L114,使用remember_token对用户进行身份验证。

我对session_id的用法有点困惑。

  1. 什么时候使用,如何使用?
  2. 如果用户登录,为了让我的 Rails 应用程序(或设备)能够唯一标识该用户,它是否会使用 session_id ?
  3. 当用户不选择 Remember_me 时会发生什么(并且没有remember_token)? devise 如何验证 current_user?

顾名思义,会话 cookie 仅对当前浏览器会话有效,即,如果浏览器退出并重新打开,则会话 cookie 不可用(除非您执行恢复会话之类的操作,在这种情况下,浏览器会恢复上一个会话中的 cookie) 。

请记住 cookie,以便将登录时间延长到当前会话之后。

Devise 使用 Warden,其工作方式是:

1) Devise 向 Warden 注册了多种策略 - 即:基于会话密钥的身份验证、来自参数的身份验证、来自记住令牌的身份验证等。
2)当请求到来时,典狱长运行每一个策略
3) 如果任何一个策略成功验证请求管理员设置“用户”(稍后通过 current_user 帮助器方法获得)并停止运行后续策略
4)如果没有一个策略成功,则声明当前没有用户登录(并且current_user将返回nil)

因此,在您的情况下,如果设置了 session_id (即密钥warden.user.user.key设置为有效的用户 ID)基于会话的身份验证策略成功,并且用户被视为已登录。如果该会话不可用,则典狱长将继续执行下一个策略,并随后到达“auth from Remember_token”策略。该策略检查记住 cookie 是否存在。如果存在,则从该 cookie 获取令牌,验证它是否仍然有效且未过期。如果是这样,则它设置“用户”并且用户被视为已登录。 如果令牌再次过期,则认为用户未登录。

如果登录时用户未选择 Remember_me,则记住令牌不会设置在记住 cookie 中。在这种情况下,如果用户关闭浏览器并再次打开它(不恢复之前的会话),则用户将不再登录到您的系统。

阅读 Warden 文档和 Warden 代码对于理解整个流程非常有帮助。您可以在典狱长代码中放入调试打印/日志行并运行您的应用程序以了解所有这些是如何工作的。

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

Rails 应用程序使用 Devise 时使用 session_id 和 Remember_user_token 的区别 的相关文章

  • Flash观看后不清晰

    这是我的创建动作 它创建一个新的 Message 实例 并通过模型验证进行检查 然后有一个简单的 if else 循环 如果模型验证已完成 则发送消息 如果要发送另一个视图 则渲染 新 视图 如果模型验证未得到满足 它只会再次呈现 新 视图
  • 需要 gem 是否会加载所有内容,包括我不使用的东西?

    Assume x是一颗宝石 包含两者Hello and Goodbye类 如果我写一个程序require x 但仅使用Hello班级 是个Goodbye类也加载了吗 您包含脚本或文件 而不是 gem With require x 你加载文件
  • 为什么安装 Ruby 1.9.3 时会出现 404 错误?

    我最近擦除了我的计算机 操作系统 Mac OS X 10 6 8 并重新安装了所有开发工具 我再次安装了RVM 但是 它不允许我安装 Ruby 1 9 3 到目前为止我已经尝试过 rvm install 1 9 3 rvm install
  • Rails escape_javascript 通过转义单引号创建无效的 JSON

    ActionView中的escape javascript方法转义撇号 作为反斜杠撇号 解析为 JSON 时会出错 例如 消息 我在这里 在打印时是有效的 JSON message I m here But 输出 I m here 导致无效
  • 从 3.1 返回后加载 Rails 3(服务器)时出现问题

    Rails 完全菜鸟 我正在使用 Hartl 教程 到了第 4 章 CSS 4 1 2 一切看起来都很顺利 但遇到了一个问题 使页面上的文字看起来
  • Jekyll 站点仅在推送到 GitHub 时才会失败

    我正在使用 Jekyll 开发一个新版本的静态网站 该网站通过 Github 页面部署 https devcampy com https devcampy com 存储库 https github com gianarb devcampy
  • Ruby 模板:如何将变量传递到内联 ERB 中?

    我有一个内联到 Ruby 代码中的 ERB 模板 require erb DATA a gt HELLO b gt WORLD template ERB new lt lt EOF current key is current value
  • Mountain Lion 的 RVM 问题

    我可以在运行 Mountain Lion 的 Mac 上安装任何 Ruby 版本 我已经确保 Brew Doctor 一切正常 当我运行 ie rvm intall 1 9 3 head 时 我得到以下信息 From git github
  • 使用 qunit 测试 emberjs/rails/devise 应用程序时“无法验证 CSRF 令牌真实性”

    我有一个 emberjs rails 应用程序 使用设备进行用户身份验证 我正在使用 qunit 构建集成测试 我在运行测试之前手动登录应用程序 测试期间可以处理 GET 请求 但 POST 请求失败 特别是 在发出 POST 请求时 我收
  • 从外部 gem 增强模型

    我在用着炼油厂CMS http refinerycms com 在我们的网站上让较少的技术人员更新内容 在 gem 内部 它们有一个 Page 类 用于映射站点上的每个顶级页面 我想在这个 Page 类上使用acts as taggable
  • ruby 包含问题

    class Foo def initialize a puts Hello a end end module Bar def initialize b puts b World end end class Sample lt Foo inc
  • asp.net cookie、身份验证和会话超时

    我有一个使用表单身份验证的 asp net 网站 我在会话中保留一些信息 例如用户名 用户 ID 电子邮件等 我通过在身份验证 cookie 上设置较长的到期日期来允许用户保持登录网站的状态 因此 当用户仍处于身份验证状态时 会话过期的情况
  • 在您的装置数据中发现外键违规。确保您没有引用关联中不存在的标签

    我运行一个测试 rake test TEST test system my test rb 并看到这个 rake test TEST test system my test rb Running 1 tests in a single pr
  • 如何将字符串拆分为新行并保留空白行?

    给出 ruby 代码 aaaa nbbbb n n split n 这输出 aaaa bbbb 我希望输出包含由 n n 我想要的结果是 aaaa bbbb 获得这个确切结果的最简单 最好的方法是什么 我建议使用lines代替split为了
  • 如何在 Rails 3 项目中包含 SSL 证书

    我开发了一个 Rails 3 项目 它使用thin作为服务器 与 Devise 和 Doorkeeper 一起进行身份验证 我想在我的项目中添加 SSL 证书 我看过一些描述如何在 Rails 3 项目中使用 SSL 证书的帖子 但没有一个
  • 将带撇号的字符串传递给辅助方法无法正确显示

    我正在使用 Rails 教程中的辅助方法 它将两个字符串连接在一起 以便在视图中的标题选择器中使用 它工作得很好 除非字符串中有撇号 当 group name 包含撇号时 结果如下 这是方法 app helpers application
  • 适用于移动应用程序的 Rails REST API。会议

    我正在创建一个移动应用程序 该应用程序拥有用户并与后端的自定义 Rails REST API 进行通信 我应该在登录时创建会话吗 或者我应该在每个请求中发送用户名和密码 如果会议是可行的方法 那么通常是如何实施的 只需生成令牌 并使用它们来
  • 从模块中获取类名

    如何从模块中获取该模块包含的类的类名 module ActMethods def some method attr names cls self class this doesn t work end end 如何进入 cls 变量 加载此
  • Rails actionmailer 打开主机电子邮件应用程序

    我想通过链接打开用户的默认邮件应用程序 附加附件 收件人 字段为空 主题和正文中包含一些预先填充的文本 使用 ActionMailer 我可以让它从我的 Gmail 帐户发送 但它不会打开默认的电子邮件应用程序 这是我在 ActionMai
  • 检查 Ruby 上的浏览​​器控制台输出

    如何检查浏览器控制台是否有错误 例如 我用 Selenium 启动了浏览器 firefox 的 chrome 并且用 Selenium WebDriver 做了一些操作 之后我想知道网络控制台中是否有任何错误 我尝试接受控制台错误 例如 d

随机推荐

  • 使用 local.xml 从顶部菜单中删除链接

    有谁知道如何使用 local xml 从顶部菜单中删除链接 默认的 checkout xml 中有
  • 为什么Rails Active Record迁移在mysql的varchar列上生成COLLATE utf8_bin

    我在 Rails 版本 3 0 10 上运行 jruby 我发现活动记录迁移以某种方式在所有 varchar 列上生成 COLLATE utf8 bin 当我表演创建表用户时 CREATE TABLE users id int 11 not
  • ElasticSearch 聚合:每个聚合排除一个过滤器

    我想过滤掉字段 A 等于 a 的文档 并且我想同时对字段 A 进行分面 当然不包括之前的过滤器 我知道您可以将过滤器放在查询 外部 以便在不应用该过滤器的情况下获取方面 例如 弹性搜索 query match all filter term
  • Android如何从Geocoder返回的地址获取街道名称

    我在用着Geocoder以相反的方式从给定的纬度和经度获取地址 你知道如何从Address 只有街道名称 Geocoder geocoder new Geocoder AutoFinderMapActivity this try List
  • SwiftUI 更新导航栏标题颜色

    如何在 SwiftUI 中更改导航栏标题颜色 NavigationView List ForEach 0 lt 15 item in HStack Text Apple font headline fontWeight medium col
  • PHP 对象属性的动态名称

    而不是使用 object gt my property 我想做这样的事情 object gt my variable 像这样使用大括号 object gt my variable
  • 从 CLI 同时执行多个 php 脚本

    我有 55 个 php 文件 我想从命令行同时运行它们 现在 我使用以下代码在多个 CLI 窗口中运行它们 php Script1 php 我希望能够调用一个 php 文件来同时执行所有 55 个 php 文件 我一直在阅读有关如何使命令行
  • 如何计算谷歌电子表格中逗号分隔数字的数量?

    我有一个有值的单元格 1 2 3 4 我需要一个在另一个单元格中返回 4 的公式 但是这个 Google 电子表格看起来非常复杂 我还需要修剪 因为数字之间可能有空格 一种选择是使用以下公式 COUNT SPLIT A1 这是一个例子
  • 为什么在测试 PSCustomObject 的属性时操作数的顺序很重要

    两种情况我都尝试过 psCustomObject x eq null and null eq psCustomObject x在 if 语句中 只有后者通过了 if 为什么会这样 这似乎不合逻辑 我的具体用例是一个包含多个环境配置的 jso
  • 这个哈夫曼表是如何创建的?

    我有一张表显示事件发生的概率 我对第 1 部分很满意 但第 2 部分我不太喜欢 我正在努力弄清楚如何 二进制数是在第 2 部分中导出的 我知道 0 被分配给最大的概率 我们从那里开始工作 但是我们如何计算出下一组二进制数是什么 数字周围的圆
  • 无法通过反应中动态 div 元素的索引号从数组中删除特定元素?

    我无法从任何动态 div 中按索引号删除数组的特定元素 const useState React function Check var Children setChildren useState function RemArr docs c
  • SQLite 的 ContentObserver?

    我一直在研究如何在 ListView 中显示数据库中的数据 同时跟踪数据库中的更改 假设我有一个聊天应用程序 它显示我所属的所有聊天室的列表视图 适配器的查询是SELECT FROM CHAT ROOM ORDER BY UPTDATE T
  • Airflow为每个DAG添加一个UI按钮

    默认情况下 每个 DAG 有一堆按钮 Trigger Dag Delete Dag等 在 UI 的主 管理 视图中 我一直在尝试添加一个像上面描述的那样的按钮 每次单击它时它都会发送一个 Http 请求 我已经成功使用这些插件 https
  • 通过值查找映射中的元素

    我正在创建一个HandleManager其目的是简单地映射Handles 这是一个typedef of long long int to strings 目的是让使用 a 的对象Handle也可以通过以下方式识别string如果它可以帮助用
  • 有没有利用 jQuery 的 JavaScript WYSIWYG?

    我看过TinyMCE http tinymce moxiecode com FCK编辑器 http www fckeditor net YUI 富文本编辑器 http developer yahoo com yui editor NicEd
  • Python底图模块无法导入

    我在 python 中导入 mpl toolkits 的底图模块时遇到麻烦 这是从模块目录运行 test py 脚本时得到的结果 usr lib python2 7 dist packages mpl toolkits basemap py
  • 对话框大小与背景图像不匹配

    我正在使用 Android SDK 制作游戏 一路上 我需要像任何其他游戏一样显示弹出窗口 对话框 用户可以升级或其他什么 我遇到的问题是对话框的大小 我正在使用RelativeLayout 并使用 wrap content 将背景设置为图
  • 将类成员复制到其他类中 - eclipse

    当您需要将某些类功能移动到另一个类中时 可以通过通过引用某些公共变量 Ctrl Shift G 搜索相应的方法 然后使用 Eclipse 的重构功能 Move 来轻松完成 该功能允许移动选定的方法进入其他班级 但也可能发生您需要复制方法的情
  • 存储词频列表选择Trie还是HashMap?

    我有一个包含 100 万个英语单词的 txt 文件 其频率采用以下格式 好 345667坏 456777 我需要使用 Java 中的 HashMap 或 Trie 数据结构来存储它 稍后我需要从列表中查找单词而不进行其他操作 我的理解是 H
  • Rails 应用程序使用 Devise 时使用 session_id 和 Remember_user_token 的区别

    我正在使用 Devise 1 5 4 和 Rails 3 0 20 以下是我所了解的事实 浏览器有一个session id的Cookie 它可以帮助普通应用程序唯一地跟踪会话 可能有也可能没有用户登录 如果用户已登录 并假设他选择了 Rem