Erarbeiten force logout für einige Benutzer von Rails-App

Ist es möglich, Kraft logout für EINIGE der Benutzer durch Entwickeln.

In meinem setup, ich bin mit Schienen 4.1.15 mit Entwickeln 1.5.4. Sitzungen sind persistent in der db und es gibt keine direkte Zuordnung mit Benutzer-ids. Gibt es eine Weise Entwickeln die Abmeldung gegen einige der Nutzer NICHT ALLE.

Ich habe versucht, das zurücksetzen Passwort als proxy, der meldet sich sofort, aber nicht immer.

user_obj.update_attributes(:password => "some_random_string")
  • Tun Sie brauchen, um es in den controller oder die rails-Konsole?
  • Im controller, beispielsweise ein admin in der Lage zu entfernen/aufheben der Sitzung für eine Liste von Benutzern, die nicht sich selbst ? Und es gibt Millionen von Datensätzen in der session-db kippe Iteration nur zu entfernen, die Sitzung für 10 Benutzer.
InformationsquelleAutor user3173122 | 2017-02-04



2 Replies
  1. 0

    Kann ich vorschlagen, dass Sie nächste Lösung.

    Fügen Sie eine neue Spalte für admin aufgerufen force_logout:boolean

    In jedem Ihren controller eine neue Aktion hinzufügen set force_logout zu true. Ex.:

    # in admins_controller.rb
    
    def force_logout
      admin = Admin.find(params[:id])
      admin.update_column(:force_logout, true)
      redirect_to :back
    end

    In application_controller.rb hinzufügen before_action an-Abmelden-Benutzer, wenn force_logout ist true

    before_action :check_force_logout
    
    def check_force_logout
      if current_user && current_user.force_logout?
        current_user.update_column(:force_logout, false)
        sign_out(current_user)
      end
    end

    Müssen Sie auch zurücksetzen force_logout Spalte nach admin angemeldet sein. In der Regel können Sie es tun session_controller.rb in Aktion create.

    • Die oben genannte Lösung nicht melden Sie sich sofort, es wird, wenn der Benutzer versucht, an login das nächste mal, die ich nicht will. Ich will einfach nur, löschen Sie Ihre aktuelle aktive Sitzungen nicht ein, wenn der Benutzer versucht, an login das nächste mal. Ich will nicht entfernen Sie die Sitzung, die erstellt wird, nachdem die Einstellung der force-logout-Feld auf true.
    • Nein, check_force_logout heißt für jede Anforderung und Abmeldung immediatelly. Wahrscheinlich benötigen, um hinzuzufügen, umleiten nach sign_out()
    • Ja wie ich oben erwähnte, wird es funktionieren. Aber ich will zerstören die aktiven Sitzungen. Deine obige Lösung nicht, auch wenn Sie eine echte login-versucht, zu öffnen von einem anderen browser mit einem neuen session, wie die Flagge ist immer noch auf true gesetzt. Ich möchte nicht warten, bis die nächste Anfrage kommen. Ich möchte es auf admin-Ebene.
    • Bei der Verwendung websoskets zu Benachrichtigen client app/browser zu löschen, session-cookie und die Seite neu laden.
  2. 0

    Zeit ausgraben dieses. Der einzige Weg, ich war in der Lage, dieses Problem zu lösen, wurde durch den Zugriff auf die sessions. Es ist langsam, aber es funktioniert.

      def sign_out_different_user
        @user = User.find(params[:id])
        sessions = ActiveRecord::SessionStore::Session.where("updated_at > ?", Time.now - 480.minutes).all
        sessions.each do |s|
          if s.data['user_email'] == @user.email
            s.delete and return
          end
        end
      end

    Ich Bedarf, um den Ablauf der Sitzung auf das user-Objekt für meine Zwecke, also habe ich diese in der Methode, als auch. YMMV

     @user.session_expires_at = Time.now
     @user.save

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.