Jef*_*.D. 3 authentication ruby-on-rails devise
我有一个使用Devise进行身份验证的Rails站点.我有一个页面(PhotosController#create
)需要在没有cookie的情况下对用户进行身份验证.我正在使用:token_authenticatable
Devise模块执行此操作,如果提供的令牌与存储在服务器端的令牌匹配,则会对用户进行身份验证.(如果你很好奇,请参阅这个问题.)
在操作完成后过期或更改令牌是一个很好的策略.这可以防止攻击者嗅探令牌并使用它成功地作为用户进行身份验证.但是,在我的情况下,我无法过期或更改令牌,因为客户端照片上传器上传了多张照片,每张照片都会导致单独的POST PhotosController#create
.因此,如果我在成功创建后使令牌过期,则第二次,第三次等上传将失败.
设计模块在模型级别指定(例如User
模型).我需要更多的粒度.
我的问题是,如何仅为单个控制器的单个操作启用:token_authenticatable
模块?或者,等效地,如何禁用除一个操作之外的所有控制器和操作的模块?:token_authenticatable
作为一个设计插件的开发者(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
归档时间: |
|
查看次数: |
3510 次 |
最近记录: |