8-2
製作登入、登出功能
- 有了登入認證機制,遍可以製作登入及登出機制
- 首先,懶惰的我一樣可以先問AI,登入登出圖示用什麼好(因為我懶得查)
請推薦font-awesome6的登出、登入圖示
- AI非常熱心的幫了我的忙
<!-- 登入按鈕 -->
<a href="login.php" class="btn btn-primary">
<i class="fas fa-right-to-bracket"></i> 登入
</a>
<!-- 登出按鈕 -->
<a href="logout.php" class="btn btn-secondary">
<i class="fas fa-right-from-bracket"></i> 登出
</a>
- 我們先修改
templates/nav.tpl,在工具列做判斷,若是還沒登入,就顯示「登入」選項,若已經登入,就顯示「發布新聞」及「登出」選項
- 在樣板中要直接使用全域變數,可以用「
$smarty.全域變數.變數名稱」,其中「全域變數」需小寫,「變數名稱」則視原先的大小寫需一致
- 「登入」及「發布新聞」其實都是連結到
admin.php,因為只有連到 admin.php 才需要輸入帳密
- 「登出」則連結到
index.php?op=logout,等一下我們就必須去 index.php 多加一組流程控制
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
...略...
{if isset($smarty.session.is_admin) && $smarty.session.is_admin}
<li class="nav-item">
<a class="nav-link" href="admin.php">
<i class="fas fa-newspaper me-1"></i>發布新聞
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="index.php?op=logout">
<i class="fas fa-right-from-bracket me-1"></i>登出
</a>
</li>
{else}
<li class="nav-item">
<a class="nav-link" href="admin.php">
<i class="fas fa-right-to-bracket me-1"></i>登入
</a>
</li>
{/if}
</ul>
- 修改
index.php 多加一組流程控制,當 $op 為 logout 時,就去執行登出用的 logout_admin() 函數,登出後轉向至首頁。
<?php
require 'header.php';
// 過濾外部傳來變數
$op = filter_input_var('op');
$id = filter_input_var('id', 'int');
$start = filter_input_var('start', 'int', 0);
switch ($op) {
case 'logout':
logout_admin();
header("location: index.php");
exit;
...略...
}
- 微調一下
function.php 的 logout_admin() 函數,將最後的 exit 刪除,避免無法轉向。
function logout_admin()
{
// 清除 session
unset($_SESSION['is_admin']);
unset($_SESSION['admin_username']);
session_destroy();
// 清除 HTTP 認證
header('WWW-Authenticate: Basic realm="Restricted Area"');
header('HTTP/1.0 401 Unauthorized');
}
- 如此,工具列就會隨著登出登入狀態不同,而有所改變
