在 Web 應用開發中,用戶登錄狀態通常分為兩類:一種是未經驗證的訪客身份,另一種是經過服務端驗證的已登錄身份。針對這兩種狀態,ThinkPHP 框架本身並未內置現成的登錄驗證功能,僅在路由層面提供相對安全的路徑保護。因此,開發者必須自行實現嚴謹的業務邏輯,確保未授權用戶無法存取後台管理介面。
正常的帳密登錄流程中,應在跳轉前將用戶標識寫入 Session;若用戶嘗試無帳密直接訪問受保護頁面,則必須在跳轉前檢查 Session 是否存在。簡言之,Session 數據的存取必須發生在頁面跳轉之前,且需靈活運用。
class ManagerController extends Controller {
public function login() {
// 登錄驗證模組
if (empty($_POST) || ($_POST['username'] == '請輸入用戶名')) {
$this->display();
} else {
$info = D('userinfo');
$res = $info->select();
$username = $_POST['username'];
$password = md5($_POST['password']);
$ver = 0;
foreach ($res as $key => $value) {
if ($res[$key]['username'] == $username && $res[$key]['password'] == $password) {
$ver++;
}
}
if ($ver) {
// 驗證通過,寫入 Session
S('username', $username);
$this->assign('username', S('username'));
$this->display('Index/index');
// $this->success("登錄成功", U('Index/index'));
} else {
$this->assign("error_info", "您的用戶名或密碼錯誤");
$this->display();
}
}
}
}
S() 函數快速操作 Session,避免直接操作 $_SESSION。password_hash()。display(),防止表單重複提交。掌握 Session 驗證的時機與方法,是構建安全 ThinkPHP 應用的基石。