Rails设计访客用户令牌

时间:2014-10-31 15:05:04

标签: ruby-on-rails devise record

有一个设置了Devise / CanCan的Rails酒店列表应用程序

class HotelsController < ApplicationController
before_filter :authenticate_user!, except: [:show]
load_and_authorize_resource

1)让所有者编辑酒店信息而不将其注册为用户的最优雅方式是什么?

2)如果我们为每家酒店创建一个唯一的令牌,并通过电子邮件发送以下链接给相应的所有者,该怎么办:

http://myapp.io/hotels/10010/edit?token=AAAABBBBCCCCDDD

..如何配置Devise / CanCan以便他们验证用户并允许他们编辑Hotels表中的相应记录?

提前谢谢!

此致 哔叽。

1 个答案:

答案 0 :(得分:0)

快速而肮脏的解决方案是覆盖authenticate_user!方法并添加对令牌的检查:

# application_controller.rb
def authenticate_user!
  if (token = params[:token] || session[:token])
    @current_user = User.find_by_token token
    session[:token] = token if @current_user
  else
    super
  end
end

首先,您必须将令牌列添加到用户表中,并且您仍然需要为其创建用户。生成令牌并通过电子邮件向他们发送带有令牌的链接。当他们第一次使用URL中的令牌到达站点时,上述方法将检查数据库中是否存在匹配记录并将其设置为current_user并将令牌保存到会话中以便随后请求仍然有效。不要忘记稍后清除该会话(注销或过期)。

您仍需要创建用户记录的原因是您不想重新开始覆盖您的康康舞逻辑,而且您还需要一个存储令牌的地方。

还有一些宝石会添加令牌身份验证:

https://github.com/gonzalo-bulnes/simple_token_authentication

一个简单的Rails内置解决方案:

http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html