gpt4 book ai didi

ruby-on-rails - 切换每个 Controller 操作的设计身份验证模块

转载 作者:行者123 更新时间:2023-12-01 08:18:42 25 4
gpt4 key购买 nike

我有一个使用 Devise 的 Rails 站点用于身份验证。我有一页 ( PhotosController#create ) 需要在没有 cookie 的情况下对用户进行身份验证。我正在使用 :token_authenticatable Devise 模块,如果提供的 token 与存储在服务器端的 token 匹配,则对用户进行身份验证。 (如果您好奇,请参阅 this SO question。)

在操作完成后过期或更改 token 是个好政策。这可以防止攻击者嗅探 token 并使用它成功地以用户身份进行身份验证。但是,在我的情况下,我不能过期或更改 token ,因为客户端照片上传器会上传多张照片,每张照片都会导致单独的 POST 到 PhotosController#create。 .因此,如果我在成功创建后使 token 过期,则第二次、第三次等上传将失败。

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

我的问题是,如何启用 :token_authenticatable模块 仅限 对于单个 Controller 的单个操作?或者,等效地,如何禁用 :token_authenticatable所有 Controller 和 Action 的模块除了 一个 Action ?

最佳答案

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

TokenAuthenticatable 是一种设计策略,您可以在此处阅读其代码:

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 选项,否则用户将存储在 session 中,请参阅:
https://github.com/plataformatec/devise/blob/master/lib/devise/models/token_authenticatable.rb#L27

关于ruby-on-rails - 切换每个 Controller 操作的设计身份验证模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098563/

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