每个控制器操作切换Devise身份验证模块

Jef*_*.D. 3 authentication ruby-on-rails devise

我有一个使用Devise进行身份验证的Rails站点.我有一个页面(PhotosController#create)需要在没有cookie的情况下对用户进行身份验证.我正在使用:token_authenticatableDevise模块执行此操作,如果提供的令牌与存储在服务器端的令牌匹配,则会对用户进行身份验证.(如果你很好奇,请参阅这个问题.)

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

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

我的问题是,如何仅为单个控制器的单个操作启用:token_authenticatable模块?或者,等效地,如何禁用一个操作之外的所有控制器和操作的模块?:token_authenticatable

Nic*_*nco 7

作为一个设计插件的开发者(devise_rpx_connectable),我很乐意回答你的问题.

TokenAuthenticatable是一个Devise策略,你可以在这里阅读它的代码:

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

如您所见,每个设计策略都有效吗?和/或valid_request?调用的方法,用于确定是否应启用策略.因此,您可以根据需要轻松覆盖此策略,或者您也可以仅覆盖valid_request?方法.只需在初始化程序中加载此类代码(当然加载AFTER设计):

module Devise
  module Strategies
    class TokenAuthenticatable < Authenticatable
      private
      def valid_request?
        params[:controller] == "photos" && params[:action] == "create"
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

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

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