2009-05-25 9 views
1

Warnung: einige davon können sehr falsch sein, also lassen Sie mich bitte wissen, wenn meine Annahmen falsch sind.Rails mit ActiveRecord Sessions und Restful-Authentifizierung: Wann wird in die Sessions-Tabelle geschrieben?

Hier ist, was ich versuche zu erreichen:

ich für die Anmeldung geruhsame-Authentifizierung bin mit. Da ich jedoch flex/ruby_amf für meine Benutzeroberfläche verwende, muss ich jede Verbindung separat von flex authentifizieren.

Die Art, wie ich mich dafür entschieden habe, war, den Login-Bildschirm auf die eingebettete Flash-Seite umzuleiten und die Session-ID als Flashvar einzufügen. Die Flash-App sendet die Sitzungs-ID bei jeder Anfrage, und ein Vorher-Filter auf allen relevanten Controllern prüft, ob der Benutzer, der der von der Sitzungs-ID identifizierten Sitzung zugeordnet ist, angemeldet ist.

Die Art, wie ich einen Benutzer mit Sitzung assoziiere, besteht darin, eine Spalte 'user_id' zur Sitzungstabelle hinzuzufügen und eine sql- "update sessions set user_id ... '" - Abfrage auszuführen, die von der Login-Funktion aufgerufen wird.

Die user_id wird jedoch erst beim zweiten Einloggen des Benutzers aktualisiert. Eine kleine Untersuchung zeigte, dass der Datensatz in der Sitzungstabelle während der Ausführung der Anmeldefunktion noch nicht existiert.

Also, wenn alles bis zu diesem Punkt macht Sinn und entspricht den besten Praktiken usw., dann ist meine Frage:

Zu welchem ​​Zeitpunkt ist der Datensatz in der Sessions-Tabelle erstellt? Gibt es eine Möglichkeit, das Session-Objekt in der Login-Funktion zu aktualisieren und Rails die user_id für mich in die Datenbank schreiben zu lassen?

Das Verhalten von Sitzungen in Schienen ist ein echtes Rätsel für mich. Ich würde mich über jede Hilfe freuen.

Vielen Dank.

+0

PS: Ich fand eine Diskussion über die Aktualisierung der Sitzungstabelle hier: http://www.nabble.com/Rails-2.3-Sessions-td22720164.html – krispyfi

+0

OK, ich habe das Problem ein wenig mehr erforscht, und ich denke, dass eine der falschen Annahmen, die ich getroffen habe, ist, dass das Sitzungsobjekt einer Zeile in der Sitzungstabelle entspricht. Ich hatte gehofft, dass ich Session [: user_id] = Users.authenticate (name, pass) machen und dann eine session.save machen könnte, um sie in die DB zu schreiben. In Wirklichkeit (korrigieren Sie mich, wenn ich falsch liege!), Erscheint das Sitzungsobjekt in codierter Form als die Datenspalte. Hier ist ein weiterer Link, der sagt, dass das, was ich tue, grundsätzlich korrekt ist: http://scottiestech.info/2009/04/02/rails-23-how-to-access-custom-columns-in-the- Sitzungstisch / – krispyfi

Antwort

1

In Rails 2.3 wird die Sitzung gespeichert, nachdem die Rack-Anwendung ihre Verarbeitung beendet hat. In herkömmlichen Rails-Anwendungen ist dies der Fall, nachdem die Anforderung vollständig verarbeitet wurde: vor Filtern, Controller-Aktion, Ansichts-Rendering und nach Filtern. Schau in actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/session/abstract/id.rb.

Wenn Sie darüber nachdenken, macht dies durchaus Sinn. Das Schreiben der Sitzung in den Speicher jedes Mal, wenn Sie etwas in die Sitzung einfügen, würde viel zusätzlichen Aufwand verursachen.

Es ist Rails, also, wenn Sie genug damit durcheinander bringen wollen, können Sie sich einen Weg finden, die Sitzung zu schreiben, um zu speichern, wann immer Sie möchten. Ich empfehle es nicht. Sie müssen den Code bei der Entwicklung von Rails ständig überarbeiten.

Sie haben recht, dass für ActiveRecord :: SessionStore eine Zeile einer Sitzung zugeordnet ist. Die Spalte data ist eine codierte Form jedes Objekts, das Sie in die Sitzung einfügen. Jedes Mal, wenn eine Anforderung eingeht, muss Rails die Sitzung neu erstellen, indem sie neue Instanzen aller Objekte erstellt, die Sie zuvor darin gespeichert haben.

Verwandte Themen