PHP实现单点登录(含示例代码)

  • Post author:
  • Post category:php



单点登录(Single Sign-On,简称SSO)是一种身份认证机制,它允许用户使用一组凭据(如用户名和密码)登录多个应用程序

。当用户已经登录一个应用程序时,他们可以无需重新输入凭据即可访问其他应用程序。以下是一个使用PHP实现SSO的示例代码: 假设有两个应用程序A和B,它们都需要使用SSO实现单点登录。我们可以使用PHP的SESSION来保存用户的登录状态,并使用COOKIE来在应用程序之间共享SESSION ID。具体实现步骤如下:

  1. 应用程序A的登录页面:

    <?php
    session_start();
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        // 验证用户凭据
        if ($_POST['username'] == 'userA' && $_POST['password'] == 'passwordA') {
            $_SESSION['username'] = $_POST['username'];
            // 生成唯一的token
            $token = md5(uniqid());
            // 将token保存到SESSION中
            $_SESSION['token'] = $token;
            // 将token保存到COOKIE中
            setcookie('token', $token, time() + 3600, '/', 'example.com', false, true);
            header('Location: /appA/dashboard.php');
            exit;
        } else {
            echo '用户名或密码错误';
        }
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>应用程序A登录</title>
    </head>
    <body>
        <form method="POST">
            <label>用户名:</label>
            <input type="text" name="username"><br>
            <label>密码:</label>
            <input type="password" name="password"><br>
            <button type="submit">登录</button>
        </form>
    </body>
    </html>

  2. 应用程序B的登录页面:

    <?php
    session_start();
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        // 验证用户凭据
        if ($_POST['username'] == 'userB' && $_POST['password'] == 'passwordB') {
            $_SESSION['username'] = $_POST['username'];
            // 获取COOKIE中的token
            $token = $_COOKIE['token'];
            // 将token保存到SESSION中
            $_SESSION['token'] = $token;
            header('Location: /appB/dashboard.php');
            exit;
        } else {
            echo '用户名或密码错误';
        }
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>应用程序B登录</title>
    </head>
    <body>
        <form method="POST">
            <label>用户名:</label>
            <input type="text" name="username"><br>
            <label>密码:</label>
            <input type="password" name="password"><br>
            <button type="submit">登录</button>
        </form>
    </body>
    </html>

  3. 应用程序A和B的dashboard页面:

    <?php
    session_start();
    if (!isset($_SESSION['username']) || !isset($_SESSION['token']) || !isset($_COOKIE['token']) || $_SESSION['token'] != $_COOKIE['token']) {
        header('Location: /login.php');
        exit;
    }
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Dashboard</title>
    </head>
    <body>
        <h1>欢迎访问应用程序A/B的Dashboard</h1>
        <p>您已经登录,用户名:<?php echo $_SESSION['username']; ?></p>
        <a href="/logout.php">退出登录</a>
    </body>
    </html>

  4. 应用程序A和B的logout页面:

    <?php
    session_start();
    // 清除SESSION
    session_unset();
    session_destroy();
    // 清除COOKIE
    setcookie('token', '', time() - 3600, '/', 'example.com', false, true);
    header('Location: /login.php');
    exit;
    ?>


    总结

    :在上述代码中,我们使用了SESSION来保存用户的登录状态和token,使用COOKIE来在应用程序之间共享SESSION ID和token。在访问dashboard页面时,我们需要验证用户是否已经登录,并且SESSION ID和COOKIE中保存的token是否一致,以防止CSRF攻击和伪造SESSION ID。在退出登录时,我们需要清除SESSION和COOKIE中的信息,以保证用户已经完全退出登录。 需要注意的是,上述代码仅仅是一个简单的示例,实际应用中需要根据具体情况来选择和处理SESSION和COOKIE的信息,并考虑到安全性、性能和稳定性等问题,例如SESSION过期时间、COOKIE域名和安全标志等。



版权声明:本文为weixin_44035459原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。