찾다
php教程php手册在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>

按照这种思路,我们只要编写自己的处理函数并进行相应的注册,就可以实现PHP Session数据的自定义存储了。


具体实现可以使用多种方案,比如可以使用NFS将Session数据存储到统一的网络设备中,也可以将Session数据保存到一个数据库中,让所有服务器连接这个共享数据库(比如MySQL)就可以了。


嗯,比较简单,而且经济。


更多考虑:
1、性能需要考量,特别是服务器数(引起资源占用)和用户量(引起Session量)非常巨大的时候。


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기