我有一个用ColdFusion编写的网站,其中包含通常的交互式网页和通过CF调度程序运行的一些任务。目录布局是
/
/app
/scheduledTasks
我希望这些任务能够使用/ app中application.cfc中创建的所有相同设置等,所以我想将整个/ scheduledTasks目录移动到/ app。问题是application.cfc使用cflogin机制和我自己的登录表单。 CF调度程序仅允许您为HTTP基本身份验证提供用户名和密码。计划的任务永远不会过去。我该如何解决这个问题,还是有更好的方法开始?
我想知道在我的application.cfc的OnRequestStart中查看一些CGI变量,例如用户代理,远程IP和/或URL参数中的魔术值,如果一切都在那里,绕过安全,因为我“知道“这是另一端的CF调度程序。这不是很好的安全性,但可以接受。
我也想知道在我的root中创建一个新的application.cfc,/ app中的application.cfc继承自。我将任务保留在原来的位置,并在那里放置一个新的application.cfc,它从根目录继承了常见的东西。这会增加复杂性,但在尝试从/ scheduledTasks访问/ app / cfcs中的CFC时遇到了问题。
有没有人遇到类似问题并解决了?
答案 0 :(得分:6)
将计划任务留在他们自己的文件夹中,就像您目前将其从网站的根目录中删除一样。
在scheduletasks文件夹中创建一个application.cfc,扩展apps目录中的一个,如下所示:
<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>
这是非常基本的安全性,但会完成工作。根据自己的喜好定制。
答案 1 :(得分:1)
Offhand,我会为计划的应用程序创建一个自定义角色。然后,在主应用程序中,当请求来自本地服务器时自动应用它。
答案 2 :(得分:1)
ColdFusion计划任务传递CGI信息中的某些数据,包括:
HTTP_USER_AGENT = CFSCHEDULE
现在HTTP_USER_AGENT是可伪造的,因此下一个问题是确定您需要访问该文件夹的安全性。你只想要CF来运行这些任务吗?或者你也想从外面运行它们?只是你的电脑?等等一旦确定你可以为它编码,rip747的解决方案是一个很好的解决方案,所以我不打算提出任何建议! ;)
答案 3 :(得分:1)
我将检查请求是否来自本地IP(如果您在同一服务器上运行计划......).....另一个(我相信更好)解决方案是我通常允许的webservices或监控例程在外部使用而无需登录:
在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.如果调用者软件没有实现cookie并保持会话状态,它就可以工作。 2.如果呼叫者软件保持会话,则允许访问通过cfid&amp;的受保护页面。 cftoken在通话网址中。 3.如果非常灵活,除了最终添加新目录和DESTROY THE APPLICATION ...之外没有维护...(我使用
<cfif isDefined("url.destroyApp")>
<cfset reinit = this.onApplicationStart()>
</cfif>
on onRequestStart方法和
<cfset StructClear(application)>
作为onApplicationStart方法的第一行。
希望它有所帮助!