LINUX.ORG.RU

Удаление неиспользуемых сессий

 


0

2

Собсно, мучаю rails(4.0.4, not found, ага), создал обычное приложение, есть юзеры, есть сессии:

class User < ActiveRecord::Base
  has_one :session, dependent: :destroy
end

class Session < ActiveRecord::Base
  belongs_to :user
end

Юзер может входить и выходить, при входе создаётся сессия, при выходе - уничтожается, и вот тут у меня возник вопрос: гарантировано уничтожить сессию я могу только при выходе юзера, но ведь велика вероятность того, что будут появлятся невалидные сессии(например, кто-то просто забудет выйти) - как лучше всего организовать удаление таких сессий? В какой момент лучше всего это делать? Или вообще не париться? Потому как при новом заходе юзера я удаляю его старую сессию. (Но ведь не факт, что будет новый заход) Или по расписанию запускать скрипт, который будет чистить таблицу от сессий чей срок жизни истёк?

PS Вопрос не принципиально по rails, тэг для красоты поставил.

Или по расписанию запускать скрипт, который будет чистить таблицу от сессий чей срок жизни истёк?

This. Разве в rails нет интеграции с cron?

anonymous
()
Ответ на: комментарий от anonymous

Незнаю, погуглил, вроде есть, наверно остановлюсь на этом варианте, а может и забью. Решено кароч.

neversleep ★★
() автор топика

Тут не важно, rails это, или нет, этот вопрос решается везде одинаково. Либо чистить по крону, либо, если для хранилища сессий используется что-то типа redis, указывать ttl

heisenberg ★★
()
Ответ на: комментарий от heisenberg

^ это правильный ответ ^

Стоит разве что добавить, что хранить сессии в БД — негодная идея. Если приложение мелкое и лень морочиться с мемкэшем/редисом, то можно использовать рельсовый механизм из коробки (на файловой системе в tmp).

Apple-ch ★★
()
Ответ на: комментарий от blackst0ne

Devise используется на сайте, но планируется, что будет еще настольное(/мобильное/какое-угодно) приложение - некий клиент, который при подключении будет использовать те же данные для аутентификации, что и юзер на сайте, и у которого должна быть своя отдельная сессия, независящая от сессии юзера на сайте, и вот она самодельная.
Пример:

class Client::SessionsController < ApplicationController

  before_action :find_user_by_sid, only: [:logout]

  def login
    response = { error: ERROR_INVALID_LOGIN }

    if params.key?(:username) && params.key?(:password)
      @user = User.where(login: params[:username]).first
      if @user && @user.valid_password?(params[:password])
        @user.session.destroy if @user.session

      	@user.session = Client::Session.new
      	@user.session.random_hash = Digest::MD5.hexdigest(Random.new.rand.to_s)

      	response[:error] = ERROR_OK
      	response[:sid] = @user.session.random_hash
      end
    end
    render json: response
  end

  def logout
    @user.session.destroy
  end

  private

  def find_user_by_sid
    @user = Client::Session.where(sid: params[:sid]).first.user if params.key?(:sid)
    render json: { error: ERROR_INVALID_SESSION } unless @user # User Not Found
  end
end


Есть ли смысл здесь что-то выдумывать? (Помимо login и logout, есть еще один экшн.) Или как организовать это по другому?(с помощью devise, или еще как-нибудь?)

Насчёт мемкэша и редиса почитаю, да и вообще, сдаётся мне, надо много чего еще почитать :) Спасибо за советы, в целом ответ понятен, ссылки на материалы по этой теме приветствуются.

neversleep ★★
() автор топика
Ответ на: комментарий от neversleep

будет еще настольное(/мобильное/какое-угодно) приложение - некий клиент, который при подключении будет использовать те же данные для аутентификации, что и юзер на сайте, и у которого должна быть своя отдельная сессия, независящая от сессии юзера на сайте

пили web service хоть SOAP хоть REST

exception13 ★★★★★
()

Какие-то у вас странные сессии. Быть может в ROR всё иначе, но обычно механизм сессий подразумевает хранение в течение ограниченного времени и вручную никто ничего не чистит - это точно. Так же, при наличии поддержки неизжопного механизма сессий не нужно думать о том, сможет ли юзер залогиниться с двух разных устройств одновременно.

jenyadoe
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.