【发布时间】:2014-08-05 07:47:38
【问题描述】:
我正在寻找一种方法来创建和共享到 Rails 视图的受保护链接。
在我的应用程序中,用户可以创建项目页面。我想让用户创建共享链接,以便只有具有链接的收件人才能访问项目页面并将 cmets 留在该页面上。我什至可能想为链接添加密码保护。
这有什么宝石吗?
【问题讨论】:
标签: ruby-on-rails ruby
我正在寻找一种方法来创建和共享到 Rails 视图的受保护链接。
在我的应用程序中,用户可以创建项目页面。我想让用户创建共享链接,以便只有具有链接的收件人才能访问项目页面并将 cmets 留在该页面上。我什至可能想为链接添加密码保护。
这有什么宝石吗?
【问题讨论】:
标签: ruby-on-rails ruby
我不知道任何受保护链接的宝石,我可以想象很难找到这样一个单独功能的共同点。
但是,我将如何实现这样的系统。基本思想是将 id 替换为实际上“无法猜测的”token。
1 - 为您要保护的资源创建一个token 列(index: true、unique: true)
2 - 在模型中,添加验证、生成器、回调和覆盖to_param
validates :token, presence: true
validates :token, uniqueness: true
before_validation :generate_token, on: :create
def generate_token
begin
self.token = SecureRandom.urlsafe_base64(64, false)
end while self.class.find_by(token: token)
end
def to_param
token
end
3 - 更改路由以使用 :token 作为 url 参数
resources :things, param: :token
4 - 将控制器更改为通过令牌而不是 id 查找
@thing = Thing.find(params[:id]) # change this
@thing = Thing.find_by(token: params[:token]) # to this
现在,thing_url(@thing) 将返回一个您可以安全分享的网址:
http://example.com/things/KSwdmTuDSVOGLTHtjK-RU78x7Bme_g-noTrNcovrtXioxPletLvNK35ia_F8CpIBtNDv-_xQ5bZ8uuv18msD4w
当然,您需要将thing 和Thing 分别替换为您的型号名称。
【讨论】:
param: :token_or_id,然后决定在控制器中做什么。基本上有两条路径:(a) 使用find(...) 通过id 查找事物,然后检查用户是否有权访问它(b) 否则使用find_by(token: ...) 通过令牌查找事物。但是我不知道为这些情况添加单独的 url 助手的方法。