Hallo,
ich habe hier ein unschönes Problem mit cflogin und Session Vars.
Wenn ich meine Seite öffne (es gibt keinen Content ohne Login) erscheint mein Login-Formular, ich gebe meine Daten ein und werde eingeloggt.
Während dem Login-Vorgang werden einige User-Infos in die Session geschrieben. Soweit funktioniert das auch.
Wenn ich aber nach dem Login den Browser schliesse und ihn neu öffne, kommt nach dem Login eine Fehlermeldung, da offensichtlich keine Session Vars gesetzt wurden.
Momentan fange ich diesen Fehler mit onError ab, setze einen cflogout und danach ein cflocation auf die Startseite. Nun wird wieder das Login Formular angezeigt und ich kann mich wie gehabt einloggen.
Wenn ich nach dem Login über einen Link auslogge und dann neu einlogge klappt es auf Anhieb. Es crashed nur, wenn ich den Browser schliesse und neu öffne.
Im CFAdmin sind J2EE Sessions aktiviert, so dass Sessions gekillt werden, sobald der Browser geschlossen wird. Die Seite läuft auf CF8.
Hier mal meine Application.cfc:
PHP-Code:
<cfcomponent output="false">
<!--- Application Settings: Session, Script Protection etc.--->
<cfset this.name = "Intranet">
<cfset this.loginstorage="session">
<cfset this.sessionManagement = true>
<cfset this.scriptProtect = true>
<cfset this.setClientCookies = true>
<cfset this.setDomainCookies = true>
<cfset this.sessionTimeOut = CreateTimeSpan(0,1,0,0)>
<cfset this.applicationTimeOut = CreateTimeSpan(2,0,0,0)>
<cfset this.Path = ExpandPath("*.*")>
<cfset this.Directory = GetDirectoryFromPath(thisPath)>
<!--- Application starts --->
<cffunction name="onApplicationStart" access="public" returntype="any" output="yes">
<cfquery name="application.mitarbeiter" datasource="intranet">
SELECT * FROM users
</cfquery>
<cfquery name="application.news" datasource="intranet" maxrows="2">
SELECT * FROM aktuelles ORDER BY id DESC
</cfquery>
<cfquery name="application.accounts" datasource="intranet">
SELECT * FROM accounts
</cfquery>
<cfquery name="application.kontakte" datasource="intranet">
SELECT * FROM kontakte ORDER BY type, firma, name
</cfquery>
<cfquery name="application.marken" datasource="intranet">
SELECT * FROM marken ORDER BY seit DESC
</cfquery>
</cffunction>
<!--- Request starts --->
<cffunction name="onRequestStart" returntype="any" access="public" output="false">
<cfif structKeyExists(url,"logout")>
<cflogout>
</cfif>
<cflogin>
<cfif NOT IsDefined("cflogin")>
<cfset structclear(session)>
<cfinclude template="login.cfm">
<cfabort>
<cfelse>
<cfset theusername=trim(form.j_username)>
<cfset thepassword=trim(form.j_password)>
<cfquery name="auth" datasource="intranet">
SELECT * FROM users WHERE samaccountname='#theusername#' AND password='#thepassword#'
</cfquery>
<cfif auth.recordcount gt 0>
<cfset session = structnew()>
<cfset session.vorname = auth.givenname>
<cfset session.name = auth.sn>
<cfset session.abteilung = auth.department>
<cfset session.tel = auth.telephonenumber>
<cfset session.mail = auth.mail>
<cfset session.titel = auth.title>
<cfset session.standort = auth.physicalDeliveryOfficeName>
<cfset session.geburtsdatum = lsdateformat(auth.description,"dd. mmmm yyyy")>
<cfif #auth.mobile# NEQ "">
<cfset session.handy = auth.mobile>
</cfif>
<cfset session.initials = auth.initials>
<cfset roles ="user">
<cfloginuser name="#theusername#" password="#thepassword#" roles="#roles#">
<cfset session.start=Dateformat(now(),"yyyy-mm-dd HH:mm:ss")>
<cfquery name="init" datasource="intranet">
INSERT INTO logfiles (sessionid,start,initials,pages) VALUES ('#session.sessionid#','#session.start#','#session.initials#',"LOGIN")
</cfquery>
<cfelse>
<cfinclude template="login.cfm">
<cfabort>
</cfif></cfif>
</cflogin>
</cffunction>
<!--- Request ends --->
<cffunction name="onRequestEnd" access="public" output="yes">
<cfquery name="pages" datasource="intranet">
SELECT pages FROM logfiles WHERE sessionid='#session.sessionid#'
</cfquery>
<cfset uppages = pages.pages&","&replace(CGI.SCRIPT_NAME,"/","","ALL")>
<cfquery name="log" datasource="intranet">
UPDATE logfiles SET pages='#uppages#' WHERE sessionid='#session.sessionid#'
</cfquery>
</cffunction>
<!--- Session ends --->
<cffunction name="onSessionEnd" returntype="any" access="public">
<cflogout>
</cffunction>
<!--- This should never happen... --->
<cffunction name="onError" output="no">
<cfargument name="Exception" required=true/>
<cfargument type="String" name="EventName" required="true"/>
<cfif Find("Element VORNAME is undefined in SESSION.",Arguments.Exception.Message,0)> <!--- Die unschöne Lösung --->
<cflogout>
<cflocation addtoken="no" url="index.cfm">
<cfelse>
<cfmail charset="utf-8" from="intranet@company.com" subject="Intranet Fehlermeldung" to="admin@company.com" type="html">
<p style="font-family:Verdana;"><strong>The server made a boo boo! ;)</strong></p>
<cfdump var="#Arguments#">
</cfmail>
</cfif>
</cffunction>
</cfcomponent>
Die Datenbankfelder sind nach den entsprechenden ActiveDirectory Feldern benannt, da später eine Authentifizierung über LDAP erfolgen soll.