我有一个 Rails 站点,使用Devise https://github.com/plataformatec/devise用于身份验证。我有一页(PhotosController#create
)需要在没有 cookie 的情况下对用户进行身份验证。我正在这样做:token_authenticatable
Devise 的模块,如果提供的令牌与服务器端存储的令牌匹配,则对用户进行身份验证。 (看这个问题 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(使用前将#替换为@)