ColdFusionのスケジュールされたタスクは、 - <のcflogin>使用している場合どのように確保するには?
-
16-09-2019 - |
質問
私はいつものインタラクティブなWebページやCFスケジューラを介して実行いくつかのタスクの両方が含まれているColdFusionで書かれたWebサイトを持っています。 DIRレイアウトがある
/
/app
/scheduledTasks
私はなど、タスクはすべて同じ設定を使用できるようにしたいと思いますので、私は/アプリにその全体/ scheduledTasksディレクトリを移動したい/アプリの内部にApplication.cfcで作成されました。問題は、Application.cfcのはのcfloginメカニズムや形で自分のログを使用していることです。 CFスケジューラは、あなたがHTTP基本認証用のユーザ名とパスワードを指定することができます。スケジュールされたタスクは、乗り越えることは決してありません。どのように私はこの問題を解決するか、そもそもよりよい方法があることができますか?
私は "I以来のバイパスセキュリティは、そのようなユーザーエージェント、リモートIP、および/またはURLのparamの、すべてがそこにあるかの魔法値としての私のApplication.cfcのonRequestStartメソッドでいくつかのCGI変数を見てについて不思議に思っていましたそれはもう一方の端のCFのスケジューラだ」知っています。これは偉大なセキュリティではありませんが、それは許容可能である。
私も/アプリでのApplication.cfcから継承するというのが私のルートに新しいのApplication.cfcの作成について不思議に思っていました。私は、彼らがしている仕事を残し、ルートから共通のものを継承するだけでなくそこに新しいApplication.cfcのを置くと思います。しかしこれは複雑さを増し、scheduledTasks /から/アプリ/フロンの内部フロンにアクセスしようとしたとき、私は問題を持っていた。
誰でも同様の問題を持っていたし、それを解決した?
解決
自分のフォルダにスケジュールタスクを残しています。
そのようなアプリケーションのディレクトリ内の1を拡張scheduletasksフォルダ内のApplication.cfcを作成します:
<cfcomponent extends="/.apps/application">
onRequestStartメソッドをオーバーロードし、そのようなあなたの認証に入れます:
<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>
これは非常に基本的なセキュリティですが、仕事を得るでしょう。お好みに合わせてカスタマイズします。
他のヒント
ぶっきらぼう、私はスケジュールされたアプリケーション用のカスタム役割を作成します。リクエストがローカルサーバから来ているときに、メインアプリケーションでは、自動的にそれを適用します。
ColdFusionのスケジュールされたタスクを含むCGI情報に特定のデータを渡します
HTTP_USER_AGENT = cfscheduleの
次の質問は、あなたがフォルダにアクセスする必要がどのように安全な決定することであるので、今HTTP_USER_AGENTはfakeableです。あなたが唯一のCFは、これらのタスクを実行しますか?それとも、同様の外からそれらを実行したいですか?ちょうどあなたのコンピュータ?などそれはあなたがそれとrip747のソリューションをコードすることができる決定されると私は何かを示唆するつもりはない良いものです! ;)
私は(...あなたが同じサーバーでスケジュールを実行している場合)要求は、ローカルIPから来ているだけでことを確認します.....別の(私はより良いと信じて)解決策は、私がWebサービスを許可するかしnormallydoものです監視ルーチンは、外部とログインせずに使用されます:
あなたにApplication.cfcの、方法onApplicationStart、のようなものを入れます:
<!--- List of Directories Excluded from Login --->
<cfset application.ExcludedLoginDirs = "/monitoring/registration/wservices/">
次に、あなたのonSessionStart(または任意の方法あなたが不許可のアクセスを防止し、ログインするためにリダイレクトするユーザーでます:
<!--- 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>
など.......
この方法のいくつかの利点があります: 発信者ソフトウェア1.If、それは動作しますが、クッキーを実装し、セッション状態を維持しません。 2.発信者ソフトウェアがセッションを維持しない場合、アクセスはコールのURLにCFID&CFTOKENを渡す保護されたページに付与されます。 3.もし非常に柔軟で、最終的に新しいディレクトリを追加し、アプリケーションを破壊する以外にありませんメンテナンス...(I使用
<cfif isDefined("url.destroyApp")>
<cfset reinit = this.onApplicationStart()>
</cfif>
onRequestStartメソッドにと
<cfset StructClear(application)>
onApplicationStartメソッドの私の最初の行としてます。
それが役に立てば幸い!