最近我接到任务,要设计出一种方案,为 Web 站点提供文件夹安全访问。这样做是出于以下想法,即一个用户可以进入该站点,并继而自动进入默认的文件夹,这个文件夹里列的是另一个页面的一些文件,它们之间已经建立链接。当用户点击某个文件名时,就可以打开相应的链接,看到那个文件的内容。 ( 这类似于在 FTP 中,一个用户的认证信息直接将他导入到一个特定的目录下。不同之处在于这是将用户从一个 Web 界面导入到一个文件中。 ) 我会一步一步向你展示我是怎样设计出我的方案的。 ( 本文中的编码已经经过测试并取得成功,可以在 Windows 2000 Server 的 Internet Information Services (IIS)5.0 中运行。 )
打基础
该 Web 站点在装有 Windows 2000 的机器上。由于在这样的环境下, IIS 与 Windows 完全结合在一起,因此,我决定好好利用这种鉴别机制。当用户进入最开始的页面时, LOGON_USER 环境变量通常会得到该用户的详细信息。由于 Windows 对鉴别用户和向用户授权都格外谨慎,我们唯一需要费神的是决定当前登录的用户该从哪里获取文件信息。由于这个方案中不存在数据库的交互作用,因此我的这个程序采用的是 XML 文件,这些文件可以长久保持用户信息。 XML 数据会被长久保持在应用程序变量中,如果这个应用程序 XML 数据发生了任何改变,也都会被长久地保持在该 XML 文件中。当然,这个例子中,唯一长久保持的是当前登录的用户的鉴定信息。这也就是当前用户的 SessionID 。
为了让这些文件夹更灵活,我想允许用户以个人用户或群体用户的身份都可以访问它。这就要求这些文件夹向个人用户和群体用户提供访问路径,而且这些信息要储存在 XML 文件中。这样一来,我们需要三个 XML 文件:一个为个人用户准备的,一个为群体用户,另一个为文件夹准备。
用户的 XML 文件包含用户的一些信息。例如,每个登录的用户都有一个用户名。当某个用户访问该 Web 站点时,就创建了一个会话,会话标志符可以识别这个会话。由于每一个会话对应一个用户,那么鉴别用户的用户节点就包括一个 sessionId 属性,用来保存当前的会话标志符。 SessionId 属性可以用来在访问信息中查找用户的 ID 。这时,你同样需要为用户准备一个默认的文件夹。图表 A 中包含了一个用户 XML 文件的例子。
图表 A
<?xml version='1.0'?>
群体用户的 XML 文件包含集体信息及各个群体中的用户的信息。 每一个群体的节点都包括一组用户,这些用户都通过它们的 ID 来鉴别。图表 B 中包含了一个群体 XML 文件的例子。
图表 B
<?xml version='1.0'?>
<groups>
<group id="1" username="administrators">
<users>
<user id="1"/>
</users>
</group>
</groups>