在PHP中实现单点登录(Single Sign On)的简单方法
http://hi.baidu.com/keepnet/blog/item/ada25d1caad26d144134175c.html 单点登录是大容量系统必备的功能,市面上有几款昂贵的商业系统,若不是财大气粗,恐怕用不起。 怎么样才能简单、经济的实现这个功能?我们在这里探讨一种可行的方案。 当前开发Web应用
http://hi.baidu.com/keepnet/blog/item/ada25d1caad26d144134175c.html
单点登录是大容量系统必备的功能,市面上有几款昂贵的商业系统,若不是财大气粗,恐怕用不起。
怎么样才能简单、经济的实现这个功能?我们在这里探讨一种可行的方案。
当前开发Web应用中,Apache + PHP + MySQL是中小型企业降低成本的必选架构,这里我们来实现PHP的单点登录,让这种经济性的架构能够扩展到的群集服务器层面。
我们的设想是将PHP的Session数据集中存储,这样对于不同服务器中运行的PHP来说,只有一个共有的Session数据库,那么用户在服务器A登 录所生成的Session数据在服务器B、C、D等服务器都可以共享,就可以免除多次登录。但由于PHP的Session是需要Cookie的,而 Cookie又是与域名相关的,所以采用这个方案的各个服务器需要有相同的域名(至少是相同的二级域名),比如:
1、所有服务器的域名都是www.766.com,这个东东DNS轮询就可以实现;这个时候,在PHP中将Cookie域名设置为www.766.com即可;
2、所有服务器的域名都是以.766.com结尾的三级域名,比如a.766com,b.766.com等等,这个时候,在PHP中将Cookie域名设置为.whybsd.com就可以共享Cookie了。
解决了先决条件,我们现在来看看PHP的Session存储方法,在PHP手册说明中,有一个叫session_set_save_handler()的函数,这个函数是用来注册用户自定义的Session数据存储接口的。
以下是PHP手册自带的示例:
<span><span><span><?php <br>
</span><span>function </span><span>open</span><span>(</span><span>$save_path</span><span>, </span><span>$session_name</span></span><span><span>)<br>
{<br>
global </span><span>$sess_save_path</span></span><span><span>;<br>
</span><span>$sess_save_path </span><span>= </span><span>$save_path</span></span><span><span>;<br>
return(</span><span>true</span></span><span><span>);<br>
}<br>
<br>
function </span><span>close</span></span><span><span>()<br>
{<br>
return(</span><span>true</span></span><span><span>);<br>
}<br>
<br>
function </span><span>read</span><span>(</span><span>$id</span></span><span><span>)<br>
{<br>
global </span><span>$sess_save_path</span></span><span><span>;</span></span></span>
<span><span><span><br>
</span><span>$sess_file </span><span>= </span><span>"</span><span>$sess_save_path</span><span>/sess_</span><span>$id</span><span>"</span></span><span><span>;<br>
return (string) @</span><span>file_get_contents</span><span>(</span><span>$sess_file</span></span><span><span>);<br>
}<br>
<br>
function </span><span>write</span><span>(</span><span>$id</span><span>, </span><span>$sess_data</span></span><span><span>)<br>
{<br>
global </span><span>$sess_save_path</span></span><span><span>;<br>
<br>
</span><span>$sess_file </span><span>= </span><span>"</span><span>$sess_save_path</span><span>/sess_</span><span>$id</span><span>"</span></span><span><span>;<br>
if (</span><span>$fp </span><span>= @</span><span>fopen</span><span>(</span><span>$sess_file</span><span>, </span><span>"w"</span></span><span><span>))
{<br>
</span><span>$return </span><span>= </span><span>fwrite</span><span>(</span><span>$fp</span><span>, </span><span>$sess_data</span></span><span><span>);<br>
</span><span>fclose</span><span>(</span><span>$fp</span></span><span><span>);<br>
return </span><span>$return</span></span><span><span>;<br>
} else {<br>
return(</span><span>false</span></span><span><span>);<br>
}<br>
<br>
}<br>
<br>
function </span><span>destroy</span><span>(</span><span>$id</span></span><span><span>)<br>
{<br>
global </span><span>$sess_save_path</span></span><span><span>;<br>
<br>
</span><span>$sess_file </span><span>= </span><span>"</span><span>$sess_save_path</span><span>/sess_</span><span>$id</span><span>"</span></span><span><span>;<br>
return(@</span><span>unlink</span><span>(</span><span>$sess_file</span></span><span><span>));<br>
}<br>
<br>
function </span><span>gc</span><span>(</span><span>$maxlifetime</span></span><span><span>)<br>
{<br>
global </span><span>$sess_save_path</span></span><span><span>;<br>
<br>
foreach (</span><span>glob</span><span>(</span><span>"</span><span>$sess_save_path</span><span>/sess_*"</span><span>)
as </span><span>$filename</span></span><span><span>) {<br>
if (</span><span>filemtime</span><span>(</span><span>$filename</span><span>)
+ </span><span>$maxlifetime </span><span><span>time</span></span><span><span>())
{<br>
@</span><span>unlink</span><span>(</span><span>$filename</span></span><span><span>);<br>
}<br>
}<br>
return </span><span>true</span></span><span><span>;<br>
}<br>
<br>
</span><span>session_set_save_handler</span><span>(</span><span>"open"</span><span>, </span><span>"close"</span><span>, </span><span>"read"</span><span>, </span><span>"write"</span><span>, </span><span>"destroy"</span><span>, </span><span>"gc"</span></span><span><span>);<br>
<br>
</span><span>session_start</span></span><span><span>();<br>
<br>
</span></span><span><span>// proceed to use sessions normally<br>
<br>
</span><span>?></span></span></span></span>
具体实现可以使用多种方案,比如可以使用NFS将Session数据存储到统一的网络设备中,也可以将Session数据保存到一个数据库中,让所有服务器连接这个共享数据库(比如MySQL)就可以了。
嗯,比较简单,而且经济。
更多考虑:
1、性能需要考量,特别是服务器数(引起资源占用)和用户量(引起Session量)非常巨大的时候。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.
