Токены гостевых пользователей Rails Devise

Существует приложение Rails со списком отелей с настроенным Devise/CanCan.

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?

Заранее спасибо!

С уважением, Серж.


person Serge    schedule 31.10.2014    source источник


Ответы (1)


Быстрым и грязным решением было бы переопределить метод 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

person DiegoSalazar    schedule 31.10.2014
comment
Идея есть, смысл есть. Большое спасибо! - person Serge; 04.11.2014