Skip to content

Instantly share code, notes, and snippets.

@jasonheecs
Last active September 5, 2024 21:06
Show Gist options
  • Save jasonheecs/9f44f9a0a90a6c446e4316b675d85eb6 to your computer and use it in GitHub Desktop.
Save jasonheecs/9f44f9a0a90a6c446e4316b675d85eb6 to your computer and use it in GitHub Desktop.

Revisions

  1. jasonheecs revised this gist Mar 11, 2021. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions session_timeout_controller.rb
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,4 @@
    class SessionTimeoutController < Devise::SessionsController
    include SkipTimeouttable

    prepend_before_action :skip_timeout, only: [:check_session_timeout, :render_timeout]

    def check_session_timeout
  2. jasonheecs created this gist Mar 11, 2021.
    36 changes: 36 additions & 0 deletions session_timeout_controller.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,36 @@
    class SessionTimeoutController < Devise::SessionsController
    include SkipTimeouttable

    prepend_before_action :skip_timeout, only: [:check_session_timeout, :render_timeout]

    def check_session_timeout
    response.headers["Etag"] = "" # clear etags to prevent caching
    render plain: ttl_to_timeout, status: :ok
    end

    def render_timeout
    if current_user.present? && user_signed_in?
    reset_session
    sign_out(current_user)
    end

    flash[:alert] = t("devise.failure.timeout", default: "Your session has timed out.")
    redirect_to login_path
    end

    private

    def ttl_to_timeout
    return 0 if user_session.blank?

    Devise.timeout_in - (Time.now.utc - last_request_time).to_i
    end

    def last_request_time
    user_session["last_request_at"].presence || 0
    end

    def skip_timeout
    request.env["devise.skip_trackable"] = true
    end
    end