Rumah >pembangunan bahagian belakang >masalah PHP >PHP melaksanakan log masuk tunggal pengguna

PHP melaksanakan log masuk tunggal pengguna

WBOY
WBOYasal
2023-05-06 14:59:081391semak imbas

Dengan pembangunan Internet, semakin banyak laman web dan aplikasi menggunakan fungsi log masuk pengguna, dan salah satu kaedah pelaksanaan yang lebih penting ialah log masuk tunggal pengguna (Single Sign-On, dirujuk sebagai SSO). Kaedah ini membolehkan pengguna hanya perlu log masuk pada satu tapak atau aplikasi untuk mengakses berbilang tapak atau aplikasi lain yang berkaitan dengan tapak atau aplikasi itu pada masa yang sama, yang sangat memudahkan penggunaan pengguna.

Dalam artikel ini, kami akan menerangkan apa itu log masuk tunggal pengguna dan cara melaksanakannya menggunakan kod PHP.

Definisi log masuk tunggal pengguna

Log masuk tunggal pengguna (SSO) ialah kaedah pengesahan pengguna yang membolehkan pengguna mengakses berbilang tapak atau aplikasi berkaitan melalui satu log masuk. Dalam kaedah log masuk tradisional, pengguna perlu log masuk secara individu untuk setiap tapak web atau aplikasi, yang biasanya memerlukan memasukkan nama pengguna dan kata laluan. Single Sign-On, sebaliknya, boleh berkongsi maklumat log masuk merentas berbilang tapak atau aplikasi, menghapuskan keperluan untuk pengguna memasukkan maklumat log masuk apabila mereka berpindah dari satu tapak atau aplikasi ke yang lain.

Dengan log masuk tunggal, pengalaman pengguna boleh dipertingkatkan dengan sangat baik, yang boleh melegakan pengguna daripada proses yang membosankan untuk memasukkan kelayakan log masuk yang sama dalam setiap tapak web atau aplikasi, di samping meningkatkan keselamatan, terutamanya apabila kata laluan yang kukuh digunakan. digunakan Ini boleh mengelakkan risiko yang disebabkan oleh pengguna menggunakan kata laluan yang lemah atau kata laluan yang sama.

PHP melaksanakan log masuk tunggal pengguna

Kini kami akan menggunakan contoh mudah untuk menunjukkan cara menggunakan PHP untuk melaksanakan fungsi log masuk tunggal pengguna. Pertimbangkan senario di mana terdapat dua tapak web atau aplikasi a.example.com dan b.example.com Kami mahu pengguna melawati b.example.com selepas melawati a.example.com tanpa log masuk lagi.

Untuk mencapai matlamat ini, kami akan bermula dari aspek berikut:

1 Perkongsian data Sesi

Dalam PHP, kita boleh menggunakan $_SESSION pembolehubah untuk menyimpan. Maklumat sesi berkaitan pengguna. Apabila pengguna log masuk ke tapak a.example.com, kami boleh menyimpan maklumat pengesahan pengguna (seperti nama pengguna dan kata laluan) dalam a.example.com, serta beberapa data sesi lain, seperti halaman yang pengguna boleh akses, dan Kebenaran lain dsb.

Untuk membolehkan pengguna mengakses b.example.com tanpa log masuk semula, kami perlu berkongsi data Sesi yang diambil daripada a.example.com. Untuk mencapai matlamat ini, kami perlu menetapkan php.ini sebagai nama domain utama (iaitu session.cookie_domain) dalam fail example.com kedua-dua tapak, dengan itu memastikan ID Sesi yang digunakan dalam kedua-dua tapak adalah sama. Pada masa yang sama, kami juga perlu menggunakan mekanisme storan Sesi yang sama, seperti MySQL atau Redis, dalam kedua-dua tapak.

2. Ubah hala merentas tapak

Untuk memindahkan pengguna dari tapak a.example.com ke b.example.com, kita perlu menggunakan fungsi header dalam PHP untuk silang -Ubah hala tapak.

Selepas log masuk di a.example.com, kami akan melompat ke b.example.com. Untuk memastikan pengguna boleh mengakses b.example.com tanpa memasukkan bukti kelayakan log masuk, kami perlu menggunakan parameter URL untuk menghantar ID Sesi kepada b.example.com, supaya b.example.com boleh mendapatkan maklumat yang berkaitan dengan pengguna melalui data Sesi Berkaitan.

Secara khusus, kami boleh mendapatkan ID Sesi pengguna semasa dan menyerahkannya kepada b.example.com sebagai parameter URL Kodnya adalah seperti berikut:

session_start();

$session_id = session_id();

$url = "https://b.example.com/login.php?session_id=" . $session_id;

header("Location: $url");

Kod ini akan menetapkan semula Direct pengguna. ke halaman login.php di b.example.com dan lulus ID Sesi dalam parameter URL.

Dalam halaman login.php b.example.com, anda perlu menyemak ID Sesi dalam parameter URL dan menggunakan ID Sesi untuk mendapatkan semula data Sesi yang berkaitan dengan pengguna. Jika data berkaitan diperoleh semula, pengguna ditandakan log masuk. Kodnya adalah seperti berikut:

session_id($_GET['session_id']);
session_start();

// 检查该 Session ID 是否存在对应用户的 Session 数据
if (isset($_SESSION['user_id'])) {
    $_SESSION['logged_in'] = true;
    // 标识用户已经登录
}

3. Log keluar merentas tapak

Selain log masuk merentas tapak, kami juga perlu mempertimbangkan log keluar merentas tapak. Log keluar merentas tapak biasanya melibatkan langkah berikut:

  1. Pengguna log keluar di tapak a.example.com.
  2. Padamkan data Sesi dalam a.example.com.
  3. Hantar pemberitahuan log keluar ke tapak lain.
  4. Padamkan data sesi yang berkaitan dengan pengguna ini di tapak lain.

Untuk langkah 2, kami hanya perlu memanggil fungsi session_destroy() untuk memadam semua data Sesi yang berkaitan dengan pengguna semasa, yang akan melog pengguna keluar dari tapak semasa.

Dalam langkah 3, kita boleh menggunakan fungsi cURL PHP untuk menghantar permintaan log keluar ke tapak lain. Sebagai contoh, kami boleh menghantar permintaan POST ke b.example.com yang mengandungi maklumat seperti ID pengguna yang dilog keluar. Kodnya kelihatan seperti ini:

$user_id = 123;

$request_url = "https://b.example.com/logout.php";

$ch = curl_init($request_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('user_id' => $user_id));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
curl_close($ch);

Dalam langkah 4, kita perlu melaksanakan kod serupa untuk memadamkan data Sesi dalam setiap tapak seperti sebelum ini. Contohnya, dalam b.example.com, kami boleh menulis kod berikut untuk memadamkan data Sesi yang berkaitan dengan pengguna semasa.

session_start();
session_destroy();

4. 跨站点会话劫持

由于跨站点登录的特殊性,它会导致被恶意利用以进行跨站点会话劫持。攻击者可以通过某种方式获得受害者生成的 Session ID,然后将该 Session ID 用于攻击者自己的会话中,以此来获取受害者的权限。

为了防止这种情况的发生,我们可以使用以下几种方式来提高安全性:

  • 使用 HTTPS 进行数据加密,从而确保传输过程中敏感信息不被窃取。
  • 保持服务器端的 PHP 版本更新和安全补丁安装,以防止被已知的攻击利用。
  • 使用 session_regenerate_id() 函数定期更新 Session ID,从而减小攻击者获取当前会话 ID 的可能性。

结论

在本文中,我们介绍了用户单点登录(SSO)的含义和意义,并使用 PHP 代码演示了如何实现基本的 SSO 方案。通过单点登录,可以提高用户在网站或应用程序间的使用体验,同时也能够提高安全性。而为了确保安全性,我们还需要在保证使用方便的基础上,考虑到跨站点会话劫持等安全风险,采取相应的安全措施。相信本文对于正在考虑或正在使用用户单点登录的 PHP 开发人员来说,会有所帮助。

Atas ialah kandungan terperinci PHP melaksanakan log masuk tunggal pengguna. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn