module Authentication extend ActiveSupport::Concern included do before_action :set_request_details before_action :authenticate_user! end class_methods do def skip_authentication(**options) skip_before_action :authenticate_user!, **options end end private def authenticate_user! if session_record = Session.find_by_id(cookies.signed[:session_token]) Current.session = session_record else if self_hosted_first_login? redirect_to new_registration_url else redirect_to new_session_url end end end def create_session_for(user) session = user.sessions.create! cookies.signed.permanent[:session_token] = { value: session.id, httponly: true } session end def self_hosted_first_login? Rails.application.config.app_mode.self_hosted? && User.count.zero? end def set_request_details Current.user_agent = request.user_agent Current.ip_address = request.ip end end