根据控制器操作切换 Devise 身份验证模块

2024-02-27

我有一个 Rails 站点,使用Devise https://github.com/plataformatec/devise用于身份验证。我有一页(PhotosController#create)需要在没有 cookie 的情况下对用户进行身份验证。我正在这样做:token_authenticatableDevise 的模块,如果提供的令牌与服务器端存储的令牌匹配,则对用户进行身份验证。 (看这个问题 https://stackoverflow.com/questions/4071737如果你好奇的话。)

操作完成后使令牌过期或更改令牌是一个很好的策略。这可以防止攻击者嗅探令牌并使用它来成功验证用户身份。但是,就我而言,我无法使令牌过期或更改,因为客户端照片上传器会上传多张照片,每张照片都会生成一个单独的 POST 到PhotosController#create。因此,如果我在成功创建后使令牌过期,则第二次、第三次等上传将失败。

设计模块在模型级别指定(例如User模型)。我需要比这更多的粒度。

我的问题是,如何启用:token_authenticatable module only对于单个控制器的单个操作?或者,同等地,我如何禁用:token_authenticatable所有控制器和操作的模块except为了一个动作?


作为一个设计插件(devise_rpx_connectable)的开发人员,我很高兴回答您的问题。

Token Authenticatable 是一种 Devise 策略,您可以在此处阅读其代码:

https://github.com/plataformatec/devise/blob/master/lib/devise/strategies/token_authenticatable.rb https://github.com/plataformatec/devise/blob/master/lib/devise/strategies/token_authenticatable.rb

正如您所看到的,每个设计策略都有一个有效的?和/或有效请求?调用以确定是否应启用策略的方法。所以你可以根据你的需要轻松地重写这个策略,或者你也可以只重写valid_request?方法。只需在初始化程序中加载此类代码(当然是在加载设备之后):

module Devise
  module Strategies
    class TokenAuthenticatable < Authenticatable
      private
      def valid_request?
        params[:controller] == "photos" && params[:action] == "create"
      end
    end
  end
end

我还没有测试过这个,我不知道这是否可以开箱即用,但我希望你明白这一点,如果这不起作用,请使用调试器,或编写你自己的设计策略(请参阅我的插件,它是易于理解)等。

此外,当您使用此策略时,除非您使用 stateless_token 选项,否则用户将存储在会话中,请参阅:https://github.com/plataformatec/devise/blob/master/lib/devise/models/token_authenticatable.rb#L27 https://github.com/plataformatec/devise/blob/master/lib/devise/models/token_authenticatable.rb#L27

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

根据控制器操作切换 Devise 身份验证模块 的相关文章

随机推荐

  • 警告消息:在“...”中:因子水平无效,生成 NA

    我不明白为什么我收到此警告消息 gt fixed lt data frame Type character 3 Amount numeric 3 gt fixed 1 lt c lunch 100 Warning message In lt
  • Prestashop Web 服务 API 不断要求身份验证

    我遇到这个问题 我从 prestashop 启用了 web 服务 如果我编写 URL 直接从 post 方法传递参数 我可以访问它 mykey 但是 如果我尝试在不传递 ws key 作为参数的情况下进行访问 它会一直要求我进行身份验证 从
  • JavaScript 扩展类

    我有一个基类 function Monster this health 100 Monster prototype growl function console log Grr 我想扩展并创建另一个类 function Monkey ext
  • 如何以编程方式停止 Windows 服务

    关于Windows服务编程 如何停止我的Windows服务 这是一个非常简化的示例代码 C Here is my service class MyTestService cs public class MyTestService Servi
  • 如何使用 Valgrind 检测分段错误细节?

    我有一个 std map 它通过一些 API 调用进行初始化 当我尝试使用此地图时 出现分段错误 如何检测无效代码或无效内容或任何可以帮助我解决问题的细节 代码如下所示 std map lt std string std string gt
  • 在 SwiftUI 中,如何增加按钮的高度?

    正如您在屏幕截图中看到的 按钮高度没有调整以适应文本大小 使其看起来很丑 我怎样才能增加按钮的高度 这样它看起来就不傻了 我的问题是 如何增加 SwiftUI 中按钮的高度 我正在尝试制作类似 Minecraft 的游戏的标题屏幕 stru
  • 将电子邮件设置为 IMAP 服务器上的“已查看”

    我正在尝试从 Imap 服务器 Gmail 读取邮件 我会检查是否有新邮件 未见 并按所见进行检查 我写了这段代码但是 imap setflag full 似乎不起作用 如果我有一封新邮件 则脚本无法放置 SEEN 标志 并且它回显我总是有
  • SQLALCHEMY 忽略查询中的重音符号

    考虑到我的用户可以将数据保存为 caf 或 cafe 我需要能够使用不区分重音的查询来搜索该字段 我发现了https github com djcoin django unaccent https github com djcoin dja
  • 警告:“SDK 版本问题”。 Xcode 10.1

    当使用 xcode 10 1 上传我的应用程序时 我收到警告 警告 ITMS 90725 SDK 版本问题 此应用程序是使用 iOS 12 0 SDK 构建的 从 2019 年 3 月开始 提交到 App Store 的所有 iOS 应用程
  • mysql连接用户标志后有空格

    我有一个问题 这个有什么意义空白在用户标志之后 u在 mysql 连接字符串内 mysql u myname pmypass mydb 我的意思是说 如果我之后不传递空格 上面的命令就可以正常工作 u然后将上面的命令写如下 mysql um
  • socket,检测连接丢失

    我正在使用 TCP 连接连接服务器进程和客户端进程 并且我必须检测两台机器之间的物理连接已断开 我正在尝试使用 keepalive 来做到这一点 将默认系统范围值减少为 TCP KEEPIDLE 5TCP KEEPCNT 5TCP KEEP
  • 在 Rust 中,将 &str 拆分为每个包含一个字符的 &str 迭代器的惯用方法是什么?

    如果我想采取 str like aeiou 并将其变成一个迭代器 大致相当于 a e i o u iter 最惯用的方法是什么 我试过做 aeiou split 这对我来说似乎是惯用的 但我很空虚 strs 位于开头和结尾 我试过做 aei
  • 使用perl修改xml标签的属性值

    我有一个很长的 xml 我希望更新其中一个嵌套非常深的标签的属性值 因此不想逐个节点进行操作 此外 目标节点的结构始终不相同 如下所示 输入 XML 为
  • 创建 PHP 登录页面的最佳方法是什么?

    我对 PHP 相当陌生 正在寻找一些有关如何在 PHP 中实现身份验证的最佳实践 我是 Adob e 的传播者 令我烦恼的一件事是人们使用 Flex Flash 作为登录屏幕 因此 我想写一篇博客文章 示例 介绍如何使用 HTML PHP
  • Material Design 的 Side-Menu.Android 中的活动意图

    in https github com Yalantis Side Menu Android https github com Yalantis Side Menu Android 请帮我 当我单击侧面菜单中的每个项目时 如何转到命令 意图
  • Laravel getQueryLog 显示行查询已执行

    正如标题所说 我想知道是否有办法获得getQueryLog函数显示查询行 var dump DB getQueryLog 你不能这样做getQueryLog 但您可以监听查询 生成回溯并最终提取行号 routes php Event lis
  • 如何从点文件中提取子图

    我有一个由名为egypt的软件生成的点文件 点文件包含许多节点和边 如果我用这个点文件画图 由于节点太多 很难看清图片 而我需要的只是从一个节点开始的子图 不需要全图 有没有办法使用这个点文件从指定节点 例如start node 绘制子图
  • 避免注册表 Wow6432Node 重定向

    我尝试在 c 中使用 Microsoft Win32 RegistryKey 插入一些简单的注册表项 但路径会自动更改为 HKEY LOCAL MACHINE SOFTWARE Test to HKEY LOCAL MACHINE SOFT
  • 通过排列两个变量添加计数器列(dplyr)

    我到处寻找了一段时间 但找不到适合我情况的任何解决方案 我有一个数据框 其中混合有 ID 和 VAR 下面我尝试复制一个示例 require dplyr seed 123 N lt 3 T lt 4 id lt rep letters 1
  • 根据控制器操作切换 Devise 身份验证模块

    我有一个 Rails 站点 使用Devise https github com plataformatec devise用于身份验证 我有一页 PhotosController create 需要在没有 cookie 的情况下对用户进行身份