Flex mit Ruby on Rails + authlogic authenitifizieren
Bei meinem aktuellen Rails Projekt loggen sich die Benutzer per authlogic auf der Seite ein, alles über Rails. Da jedoch ein Teil der Seite mit einer Flex App realisiert wird, musste ich das Zusammenspiel zwischen Rails und Flex ein wenig erforschen.
Mein erster Blick fiel auf WebORB mit dem passenden Flex Plugin indem man sehr einfach die einzelnen Modells und somit die Datenbank ansprechen kann. (http://sujitreddyg.wordpress.com/2009/10/13/ruby-on-rails-extension-for-flash-builder-4/)
Hier habe ich zwar Zugriff auf das UserSession-Modell von authlogic, jedoch nicht auf die aktuelle Session und somit die eingeloggten User. Die Cookies und Sessions werden erst im UserSessionsController festgelegt.
Um nun in der Flex Anwendung zu wissen "Ist der User eingeloggt" und wenn ja "Welcher User bist du denn?" erweitert man den UserSessions Controller um folgende Methode:
def checkLogin
if logged_in?
xml = "
<usersessions>
<login>true</login>
<currentid>#{current_user_session.user.id}</currentid>
</usersessions>"
else
xml = "
<usersessions>
<login>false</login>
<currentid>false</currentid>
</usersessions>"
end
respond_to do |format|
format.xml { render : xml => xml }
end
end
Hiermit stellen wir eine Methode bereit die uns ein XML File rendert das sagt, bin ich eingeloggt, oder nicht (über das Format der XML ließe sich streiten).
In der Flex App kreiert man nun einen HTTP-Service, der auf die URL der Methode verweist, und bei erfolgreichem Result das ganze als XML ausgibt.
<fx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
public function switchStates(event:ResultEvent):void {
var xml:XML = event.result as XML;
var loggedInP:Boolean = xml.login as Boolean;
var currentID:int = xml.currentid;
trace(currentID);
}
]]>
</fx:Script>
<fx:Declarations>
<s:HTTPService resultFormat="e4x" id="login" url="http://localhost:3000/user_sessions/checkLogin" result="switchStates(event)" fault="trace('fault');"/>
</fx:Declarations>
Natürlich muss im Application tag noch
creationComplete="login.send()
gesetzt werden. Und schon hat man zwei Variablen, die den User authentifizieren.
Dezember 11th, 2009
Das klingt irgendwie unsicher. Man kann die Antwort sicher manipulieren. Ich würde noch eine signatur empfehlen.
Dezember 11th, 2009
@Gaul: Wie würdest du das machen?
März 26th, 2010
Ich versuche auch gerade mittels WebOrb Flex und Rails zusammen zu bringen.
Die Railsapplikation läuft mit authlogic. Leider kann ich nicht von Flex mittels der valueObjects auf Datensätze zugreifen. Das funktioniert erst, wenn ich “acts_as_authentic” aus dem “user.rb” Model auskommentiere.
Hast Du vielleicht einen Tipp wie man “trotz” authlogic auf die Daten zugreifen kann?
Danke und Gruß,
Klaus
März 27th, 2010
@Klaus: Auf welche Datensätze willst du zugreifen? Die vom User Model? Oder auf die aktuelle Session ob der User eingeloggt ist oder nicht?
März 27th, 2010
Hallo Hubert!
Man kann ja mittels der valueObjects auf die Datensätze des User Models zugreifen. Bei meinen versuchen wurde das allerdings von Authlogic verhindert.
Ich habe versucht mittels einer Methode in der UserService.rb Datei mit “return @user = User.find(:all)” auf die Datensätze zuzugreifen.
Das man nicht auf die Session zugreifen kann ist mir bewusst, aber das man nicht auf die Datensätze zugreifen kann ist komisch. Vielleicht hab ich da ja auch einen Fehler gemacht.
Vielleicht kannst Du mir ja sagen, wie der Aufbau Deines Projektes angelegt ist. Ich möchte Ruby nur als “Backend” nutzen und daher muss ich auch auf die Datensätze Zugriff haben.
Vielen Dank und Gruß,
Klaus
März 30th, 2010
Hi Klaus,
also wir haben bei unserem Projekt den login mit authlogic in rails gemacht, und dann nur noch per WebORB überprüft im Flex, ob der User eingeloggt ist oder nicht.
Benutzt du auch das RoR Plugin für den Flash Builder?
Kannst du den UserService auf die Funktion list() testen?
März 30th, 2010
Hallo Hubert!
Nein, das funktioniert nicht. Authlogic blockiert eine solche Anfrage (oder aber ich habe einen Fehler gemacht). Da dachte ich, dass Du da einen weg gefunden hättest. Ich wollte für mein Projekt auch WebOrb mit dem FB4 Plugin nutzen. Ich wollte aber nicht so gerne HTTPService und UserService Methoden mischen.
BTW: auf die list() Methode kann ich zugreifen, wenn ich authlogic auskommentiere.
Gruß Klaus