Frage

Ich habe eine Web-Site in Coldfusion geschrieben, die sowohl die üblichen interaktiven Webseite und einige Aufgaben enthalten durch den CF-Scheduler ausgeführt werden. Das dir Layout ist

/
/app
/scheduledTasks

Ich würde die Aufgaben gerne in der Lage sein, alle verwenden die gleichen Einstellungen, etc. in der Application.cfc erstellt innerhalb von / app so würde ich das gesamte / scheduledTasks Verzeichnis in / app bewegen möge. Das Problem ist, dass das Application.cfc verwendet den cflogin Mechanismus und mein eigenes Protokoll in Form. Der CF-Scheduler können Sie nur einen Benutzernamen und ein Passwort für den HTTP-Standardauthentifizierung liefern. Die geplanten Aufgaben erhalten nie vorbei, dass. Wie kann ich dieses Problem zu beheben, oder gibt es einen besseren Ansatz zu beginnen?

Ich habe bei einigen CGI-Variable in meinem Application.cfc der OnRequestStart über die Suche gewundert, wie die User-Agent, der Remote-IP und / oder einem magischen Wert in der URL param ist und wenn alle da sind, Bypass-Sicherheit, da ich " wissen“es ist Schedulers CF am anderen Ende. Dies ist nicht eine große Sicherheit, aber es kann akzeptabel sein.

Ich habe mich auch gefragt, über ein neues Application.cfc in meiner Wurzel zu schaffen, dass der Application.cfc in / app erbt von. Ich würde die Aufgaben lassen, wo sie sind, und eine neue Application.cfc setzt auch dort die gemeinsame Sache von der Wurzel erbt. Dies erhöht die Komplexität obwohl und ich habe Probleme gehabt, wenn die FCKW innerhalb von / app / FCKWs aus / scheduledTasks zuzugreifen versuchen.

Hat jemand hatte ein ähnliches Problem und es gelöst?

War es hilfreich?

Lösung

die Zeitplan Aufgaben in einem eigenen Ordner verlassen, wie Sie es derzeit haben die Wurzel der Site aus.

ein Application.cfc im scheduletasks Ordner erstellen, die man in dem Anwendungsverzeichnis erstreckt sich wie folgt:

<cfcomponent extends="/.apps/application">

Überlastung der onrequeststart Methode und setzte in Ihrer Authentifizierung wie folgt:

<cffunction name="onRequestStart" returntype="void" access="public" output="false">
    <cfargument name="targetPage" type="any" required="true">
    <cfif not structkeyexists(url, "access") or not url.access eq application.ApplicationName>
        <cflocation url="/" addtoken="false">
    </cfif>
</cffunction>

Dies ist sehr grundlegende Sicherheit aber wird der Job zu erledigen. gestalten nach Ihren Wünschen.

Andere Tipps

Offhand, würde ich eine benutzerdefinierte Rolle für die geplante Anwendung erstellen. Dann wird in der Hauptanwendung automatisch gelten, wenn die Anforderung aus dem lokalen Server kommt.

Coldfusion geplante Tasks übergeben in bestimmten Daten in den CGI-Informationen, einschließlich:

HTTP_USER_AGENT = CFSCHEDULE

Jetzt HTTP_USER_AGENT ist fakeable so die nächste Frage, um zu bestimmen, wie sicher Sie Zugriff auf den Ordner benötigen. CF Wollen Sie nur diese Aufgaben ausführen? Oder haben Sie sie von außen als auch ausgeführt werden soll? Sie einfach Ihr Computer? Usw. Sobald das bestimmt wird es Ihnen und rip747 Lösung codieren können gut ist, so werde ich nichts anderes vorschlagen! ;)

Ich werde prüfen nur, dass die Anforderung von einem lokalen IP kommt (wenn Sie den Zeitplan in dem gleichen Server laufen ...) ..... andere (ich besser glauben) Lösung ist, was ich normallydo einen Web Service zu ermöglichen oder Überwachungsroutinen extern genutzt werden und ohne Login:

Auf Sie Application.cfc, Methode OnApplicationStart, setzen Sie so etwas wie:

<!--- List of Directories Excluded from Login --->
<cfset application.ExcludedLoginDirs = "/monitoring/registration/wservices/">   

Dann auf Ihrem onSessionStart (oder was auch immer Methode, die Sie Benutzer nicht autorisierten Zugriff zu verhindern und umleiten um sich einzuloggen:

<!--- Find current directory --->
<cfset currentDir = listgetAt("-," & cgi.Script_Name, listLen("-," & cgi.script_Name, "/")-1, "/")>

<!--- Exclude LOGIN if user authenticated or Directory Excluded --->
<!--- In this code, I FORCE login if user is NOT autenticated AND directory is NOT excluded --->
<cfif Val(session.User_ID) EQ 0 AND ListFind(application.ExcludedLoginDirs, "#currDir#", "/") EQ 0> 
      ............Login..........
</cfif>

etc .......

Einige Vorteile auf dieser Methode sind: 1. Wenn der Anrufer Software Cookie nicht implementiert und Sitzungszustand hält, es funktioniert. 2. wenn der Anrufer Software Sitzung unterhält, den Zugriff auf geschützte Seiten gewährt vorbei cfid & CFTOKEN im Aufruf url. 3. wenn sehr flexibel und keine Wartung, außer ein neues Verzeichnis schließlich hinzuzufügen und die Anwendung DESTROY ... (ich benutze

<cfif isDefined("url.destroyApp")>
     <cfset reinit = this.onApplicationStart()>
</cfif> 

auf dem onRequestStart Verfahren und

<cfset StructClear(application)>

als meine erste Linie auf dem OnApplicationStart Verfahren.

Hoffe, es hilft!

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