Frage

Ich schreibe eine Katalysator-Anwendung, die eine relativ kurze Sitzung Ablauf (15 Minuten) haben, erforderlich ist. Ich bin der Standard-Katalysator Rahmen Authentifizierungsmodule verwenden, so dass die Benutzerdaten in der Sitzung gespeichert wird - d. H, wenn die Sitzung abläuft, Sie heraus geloggt

Viele der Anwendungen dieser Anwendung wird> 15 Minuten benötigen, zu ergänzen, so dass Benutzer wird häufig ein Formular nur ihre Sitzungsstatus zu finden ist weg und sie sind erforderlich, sich wieder anzumelden.

In diesem Fall ich die ursprüngliche Form Vorlage erhalten will, und wenn sie erfolgreich melden Sie sich an, weiter auf und das Formular Vorlage durchführen, als ob die Sitzung nicht abgelaufen war.

ich die Authentifizierung Sachen habe durch eine Auto () -Methode in der Steuerung verarbeitet - wenn Sie eine Aktion anfordern, die eine Authentifizierung erfordert und Sie sind momentan nicht angemeldet, erhalten Sie auf der Login () -Methode umgeleitet, das zeigt das Anmeldeformular und verarbeitet sie dann, sobald es eingereicht wird. Es scheint, wie es möglich sein sollte, den Antrag und alle Formularparameter zu speichern, wenn die automatische Methode zum Login-Umleitungen () und sie dann heraus zurückziehen, wenn die Login () erfolgreich - aber ich bin mir nicht ganz sicher, die besten Möglichkeit, diese Informationen zu greifen oder speichern in einer allgemeinen / Standard / wiederverwendbare Art und Weise. (Ich bin Bezifferung auf sich in der Session speichern und löschen sie dann, sobald es wieder herausgezogen ist;., Wenn das wie eine schlechte Idee scheint, das ist etwas anderes zu adressieren)

Gibt es eine Standard "Best Practices" oder Kochbuch Art und Weise, dies zu tun?

(Ein Falten. Diese Formen werden über POST eingereicht)

War es hilfreich?

Lösung 4

Am Ende landeten wir die ausstehende Anforderung (URL + params) in der Auto greifen nach oben (), Serialisierung und Verschlüsselung, und es über ein verstecktes Formularelement auf der Login-Seite vorbei. Wenn wir eine Login-Anfrage mit dem verborgenen Elemente bevölkerte bekamen, ich entschlüsselte und deserialisiert es und dann entsprechend umgeleitet (sicherstellen, dass durch den Standard zu übergeben „kann dieser Benutzer tun, um diese Sache“ Codepfade).

Andere Tipps

Ich kann nicht umhin zu denken, dass es in Mandatierung einen 15-minütige Auszeit in einer App, die routinemäßig erforderlich> 15 Minuten zwischen den Aktionen ein grundlegender Fehler ist.

Sei es wie es kann, würde ich bei über Reiten die Catalyst::Plugin::Session->delete_session Methode suchen, so dass alle Inhalte von $c->request->body_parameters serialisiert und gespeichert (vermutlich auf die Datenbank) für die spätere Wiederherstellung. Sie würden wahrscheinlich einige rudimentäre Prüfung der POST Argumente wollen, um sicherzustellen, sie sind, was Sie erwartet.

Ebenso muss create_session Verantwortung zu übernehmen, diese Daten für das Ziehen wieder aus der Datenbank und macht es auf die ursprüngliche Form Aktion zur Verfügung.

Es scheint wie eine chaotische Situation, und ich bin geneigt, meinen ersten Satz zu wiederholen ...

UPDATE:

Ob Sie delete_session oder auto, die paradoxe Frage bleibt: Sie nicht diese Informationen in der Sitzung speichern kann, weil das Time-out-Ereignis wird die Sitzung zerstören. Du hast es irgendwo mehr permanent zu speichern, so dass es überlebt die Sitzung Neuinitialisierung. Catalyst::Plugin::Session selbst wird mit Storable , und Sie sollten in der Lage sein, um mit etwas in diese Richtung:

use Storable;
...
sub auto {
    ...
    unless (...) { #ie don't do this if processing the login action
        my $formitems = freeze $c->request->body_parameters;
        my $freezer = $rs->update_or_create(
              {user => $c->user, formitems => $formitems} );
        # Don't quote me on the exact syntax, I don't use DBIx::Class
    }
    ...
    my $formitems = $c->request->body_parameters
                  || thaw $rs->find({$user => $c->user})->formitems
                  || {} ;
    # use formitems instead of $c->request->body_parameters from here on in

Die zugrunde liegende Tabelle wahrscheinlich hat (Benutzer CHAR (x), Item TEXT) oder ähnliches. Vielleicht ein Zeitstempel, so dass nichts zu alt wird wiederhergestellt. Sie können auch die Aktion speichern möchten Sie die Verarbeitung waren, die abgerufenen Form Elemente in die richtige Form gehören sicher zu sein. Sie kennen die Probleme für Ihre App besser als ich.

Ich würde speichern die Formulardaten als eine Art pro Benutzerdaten im Modell.

Katalysator :: Plugin :: Session :: peruser ist eine Möglichkeit, dies zu tun (wenn auch etwas hackishly). Ich würde empfehlen, die Sitzung mit Plugin nur für die Authentifizierung und die Speicherung aller die Zustand Info in dem Modell, das stattdessen Ihre Benutzerdaten gespeichert werden.

Und ich mit RET Meinung voll und ganz zustimmen, dass die 15 Minuten-Grenze in diesem Zusammenhang wirklich kontraproduktiv scheint.

ich auf diese kam während CPAN der Suche nach etwas völlig unabhängig.

Katalysator :: Plugin :: Wizard genau das zu tun vorgibt was du brauchst. Die Dokumentation schlägt vor, es auf eine Anmeldeseite unter Beibehaltung der Zustand der vorherigen Aktion umleiten kann.

. NB: Ich habe es nicht verwendet wird, so kann ihre Wirksamkeit nicht bürgen

Sie können immer einige Javascript auf dem Client, die alle paar Minuten, indem sie eine kleine Anfrage die Sitzung abläuft hält.

Oder Sie könnten AJAX-Check für eine aktive Sitzung haben, bevor Sie das Formular veröffentlichen und den Benutzer mit einem neuen Login-Feld zu diesem Zeitpunkt zu präsentieren, wenn nötig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top