2014-12-18 2 views
0

Использование Rails 4.0 и рубин 2.1.0Ограничить сессии количество одновременных аккаунтно завещанию, рельсы 4

Я работаю над проектом, который будет основан на подписке и счета должны иметь предел одновременных сеансов в пользователь. Например, обычный пользовательский 1 одновременный сеанс для каждой учетной записи, средний пользователь - 3 параллельных сеанса на одну учетную запись и премиум-пользователь 10 одновременных сеансов на одну учетную запись.

Я проверил каждую страницу google, stackoverflow, differents, например, devise: timeoutable или devise_session_limit gem. Я попытался с полем, называемым соединениями, которое равно 1, 3 или 10 в зависимости от пользователя. Если вход в систему пользователя, уменьшите -1 поле подключения, если пользователь выйдет из системы, увеличьте +1 поле подключения. Дело или проблема в том, что пользователь продолжает открывать сеанс и уходит, а затем никогда не будет увеличивать +1.

Любые предложения? Я работаю над этой задачей почти 3 дня, и я не могу ее получить.

Заранее благодарен!

+0

Решения Вы пробовали с инкрементированием/декремент соединения звучит хорошо, но она должна использоваться вместе с тайм-аутом, так что сеансы, которые остаются открытыми, могут быть автоматически синхронизированы и соединения увеличиваются. – DiegoSalazar

+0

Да, я пытался это сделать, но я не могу найти решение, чтобы собрать его вместе. Дело в том, как я могу контролировать, когда тайм-аут закрывает сессию. Я искал что-то вроде callbacks, таким образом: до таймаута закрытия сессии, но я не мог найти что-то. Спасибо, диего! – Luismiv85

+0

Я искал это [ссылка] (http://stackoverflow.com/questions/10088501/detect-when-a-devise-session-expires), но я не работал для меня. Я не знаю, как я могу переписать этот модуль, не так ли? – Luismiv85

ответ

0

Вы можете подключиться к устройству и до тех пор, пока у вас есть модуль с тайм-аутом, вы можете проверить, что пользователь был тайм-аут и запустить любой код, который вам нравится. См. Этот крючок для справки для справки: https://github.com/plataformatec/devise/blob/master/lib/devise/hooks/timeoutable.rb

Важной частью этого кода является проверка на наличие record.timedout?. Если это так, запустите код увеличения соединения.

Чтобы быть конкретным, напишите config/initializers/connections_updater.rb файл с этим (по аналогии с выше связанным кодом это надзиратель крюк):

Warden::Manager.after_set_user do |record, warden, options| 
    scope = options[:scope] 
    env = warden.request.env 

    if record && record.respond_to?(:timedout?) && warden.authenticated?(scope) && options[:store] != false 
    last_request_at = warden.session(scope)['last_request_at'] 

    if last_request_at.is_a? Integer 
     last_request_at = Time.at(last_request_at).utc 
    elsif last_request_at.is_a? String 
     last_request_at = Time.parse(last_request_at) 
    end 

    proxy = Devise::Hooks::Proxy.new(warden) 

    if record.timedout?(last_request_at) && !env['devise.skip_timeout'] 
     # write this method to do what you need when the session times out 
     record.increment_connections_count! # Note: record is the user model 

     Devise.sign_out_all_scopes ? proxy.sign_out : proxy.sign_out(scope) 
    end 
    end 
end 
+0

Выглядит неплохо! Я пытался в пути, но я получил эту ошибку: 'NameError в DeviseInvitable :: SessionsController # create' ' неинициализированным постоянная Разрабатывают :: Hooks' Я пытался решить сам, но я не мог. Что мне не хватает? Спасибо Диего снова !! – Luismiv85

+0

отправить свой код контроллера – DiegoSalazar

Смежные вопросы