使用 PHP 进行身份管理
了解如何在基于 PHP 的 Web 应用程序中实现身份管理……
登录和注销操作在活动浏览器中进行。这种操作环境向 Cookie 和会话模型增加了较多的复杂性。例如,浏览器的后退、前进和刷新按钮需要在代码中进行特殊处理。刷新按钮不应尝试多次发送新用户身份验证。同样,用户注销应用程序之后,刷新按钮不应触发新的身份验证请求。遗憾的是,如果程序不阻止,它们就会这样做。
调用登录 PHP 脚本(而非 XHTML Web 页)是在 Web 应用程序中确保完整注销操作的最直接的方法。PHP 脚本可以重设会话值,而 XHTML Web 页则不能,因为在向目标页提交遗失的或新的凭证时,它会传递先前的会话值。
可以使用 PHP 中的几个预定义的变量来存储全局范围的变量。其中一个就是 $_SESSION 数组。它可让您添加名称-值对,其中名称是实际数据值的索引值。使用 $_SESSION 数组的好处是简单、灵活,但缺点是会导致与其他库的冲突。
session_start() 函数返回活动的 PHP 会话 ID 值。您必须先调用 session_start() 函数,然后再调用 session_regenerate_id() 函数,因为它实际上会调用 session_destroy() 函数。session_destroy() 依赖于 PHP 会话 ID 的存在,如果您调用之前不存在会话 ID,它将引发一个错误。调用具有实际 true 参数的 session_regenerate_id() 函数将重设 PHP 会话 ID。您使用运行时错误消除机制来确保,当浏览器上下文中不存在先前的会话时,调用 session_regenerate_id() 函数不会引发错误。
| <?php // Start and regenerate session. session_start(); @session_regenerate_id(true); $_SESSION['sessionid'] = session_id(); ?> |
前面的脚本小程序在浏览器中更改了会话值,再次单击 Login 按钮将执行新的身份验证。为此,可以使用新的会话 ID 替代先前验证的 PHP 会话 ID。新的 PHP 会话 ID 将作为 URL 的一部分传送给下一个表单。
建立 PHP 会话之后,可以通过两种方法管理数据库连接:一种是在 PHP 模块和数据库之间使用持久连接,另一种是在这两者之间使用非持久连接。持久连接允许您启动一个可跨多个 Web 请求的事务范围,并且仅当您发出数据库提交命令时才结束。在持久连接的范围中,您可以运行锁定行未决更改或在未提交的更改之后的 SQL 和 PL/SQL 语句。非持久连接允许您运行 SQL 或 PL/SQL 语句,以便在打开和关闭连接期间查询或更改数据,该操作将在单个 Web 请求中发生。由单个连接限制的数据事务又称作自主事务,因为它们的持续时间仅限于连接的持续时间。
这些示例程序使用非持久性数据库连接对 Oracle 数据库进行查询和事务处理。因此,所有数据库事务都作为自主事务执行。
图 5 所示的 SignOnDB.php Web 页面在 XHTML 页面之前实现了这种类型的 PHP 脚本小程序。SignOnDB.php 表单中的 XHTML 呈现还作为 signOnForm() 函数存在于 AddDbUser.php 页面中。
您将在用户登入应用程序之后调用的所有 Web 页中放置 PHP 身份验证逻辑。目前,所有编程逻辑都位于 AddDbUser.php 页面中(如图 6 所示),但您可以将 12 个函数移到一个身份验证库中。
您的浏览器必须接受 Cookie,这些程序才能工作。如果禁用了 Cookie,您所能做的所有事情就是登录、注销并且无法输入新用户,因为这两个页面间的会话值已丢失。
测试会话身份验证。可通过以下步骤测试会话身份管理:
1. 使用以下 URL 打开会话身份管理示例,假设您已经将代码放在 htdocs 目录中:
http://localhost/SignOnDB.php
2. 可以使用基本 HTTP/HTTPS 身份验证中提供的帐户:
- 本文关键词:


