PHP 实现单点登录
1.准备两个虚拟域名
127.0.0.1 www.openpoor.com
127.0.0.1 www.myspace.com
2.在openpoor的根目录下创建以下文件
index.PHP
[php] view plain copy
- <?php
- session_start();
- ?>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8"/>
- <title>sync login</title>
- </head>
- <body>
- <?php if(empty($_SESSION['username'])):?>
- hello,游客;请先<a href="login.php">登录</a><a href="http://www.myspace.com/index.php">进入空间</a>
- <?php else: ?>
- hello,<?php echo $_SESSION['username']; ?>;<a href="http://www.myspace.com/index.php">进入空间</a>
- <?php endif; ?>
- <a href="http://www.openpoor.com/index.php">home</a>
- </body>
- </html>
login.php
[php] view plain copy
- <?php
- session_start();
- if(!empty($_POST['username'])){
- require '../Des.php';
- $_SESSION['username'] = $_POST['username'];
- $redirect = 'http://www.openpoor.com/index.php';
- header('Location:http://www.openpoor.com/sync.php?redirect='.urlencode($redirect).'&code='.Des::encrypt($_POST['username'],'openpoor'));exit;
- }
- ?>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8"/>
- <title>sync login</title>
- </head>
- <body>
- <form action="" method="post">
- <input type="text" name="username" placeholder="用户名"/>
- <input type="text" name="password" placeholder="密码"/>
- <input type="submit" value="登录"/>
- </form>
- </body>
- </html>
sync.php
[php] view plain copy
- <?php
- $redirect = empty($_GET['redirect']) ? 'www.openpoor.com' : $_GET['redirect'];
- if(empty($_GET['code'])){
- header('Loaction:http://'.urldecode($redirect));
- exit;
- }
- $apps = array(
- 'www.myspace.com/slogin.php'
- );
- ?>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8"/>
- <?php foreach($apps as $v): ?>
- <script type="text/javascript" src="http://<?php echo $v.'?code='.$_GET['code'] ?>"></script>
- <?php endforeach; ?>
- <title>passport</title>
- </head>
- <body>
- <script type="text/javascript">
- window.onload=function(){
- location.replace('<?php echo $redirect; ?>');
- }
- </script>
- </body>
- </html>
3.在myspace的根目录下创建如下文件
slogin文件 完成session的设置
[php] view plain copy
- <?php
- session_start();
- header('Content-Type:text/javascript; charset=utf-8');
- if(!empty($_GET['code'])){
- require '../Des.php';
- $username = Des::decrypt($_GET['code'],'openpoor');
- if(!empty($username)){
- header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
- $_SESSION['username'] = $username;
- }
- }
- ?>
index.php
[php] view plain copy
- <?php
- session_start();
- if(!empty($_SESSION['username']))
- {
- echo "欢迎来到".$_SESSION['username']."的空间";
- }else{
- echo "请先登录";
- }
- ?>
4.Des.php的文件内容如下
[php] view plain copy
- <?php
- /**
- *@see Yii CSecurityManager;
- */
- class Des{
- public static function encrypt($data,$key){
- $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
- $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
- srand();
- $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);
- mcrypt_generic_init($module,$key,$iv);
- $encrypted=$iv.mcrypt_generic($module,$data);
- mcrypt_generic_deinit($module);
- mcrypt_module_close($module);
- return md5($data).'_'.base64_encode($encrypted);
- }
- public static function decrypt($data,$key){
- $_data = explode('_',$data,2);
- if(count($_data)<2){
- return false;
- }
- $data = base64_decode($_data[1]);
- $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
- $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
- $ivSize=mcrypt_enc_get_iv_size($module);
- $iv=substr($data,0,$ivSize);
- mcrypt_generic_init($module,$key,$iv);
- $decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data)));
- mcrypt_generic_deinit($module);
- mcrypt_module_close($module);
- $decrypted = rtrim($decrypted,"\0");
- if($_data[0]!=md5($decrypted)){
- return false;
- }
- return $decrypted;
- }
- }
- ?>
当在openpoor登录后将session信息传到其他域名下的文件下进行处理,以script标签包含的形式进行运行。
5.此时访问www.openpoor.com和www.myspace.com都是未登录状态
登录后两个域名下都是登录状态
到此我们实现了一个简单的单点登录。
PHP 实现单点登录的更多相关文章
- 著名ERP厂商的SSO单点登录解决方案介绍一
SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...
- 看图理解JWT如何用于单点登录
单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...
- 细说SSO单点登录
什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...
- [原创]django+ldap+memcache实现单点登录+统一认证
前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...
- [原创]django+ldap实现单点登录(装饰器和缓存)
前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...
- CAS FOR WINDOW ACTIVE DIRECTORY SSO单点登录
一.CAS是什么? CAS(Central Authentication Service)是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(支持 ...
- 单点登录改进版-使用ajax分发cookie避免重定向轮询
前言 继上一篇博文:可跨域的单点登录(SSO)实现方案[附.net代码]虽然实现了单点登录,也存在很多不合理的地方.很多热心的朋友也给出了很多指导性的意见,特别是 LoveCoder提出的意见. 在很 ...
- 可跨域的单点登录(SSO)实现方案【附.net代码】
SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前session是否 ...
- .net 单点登录实践
前言 最近轮到我在小组晨会来分享知识点,突然想到单点登录,准备来分享下如何实现单点登录,所以有了下文.实现方案以及代码可能写得不是很严谨,有漏洞的地方或者错误的地方欢迎大家指正. 刚开始头脑中没有思路 ...
- asp.net mvc 权限过滤和单点登录(禁止重复登录)
1.权限控制使用controller和 action来实现,权限方式有很多种,最近开发项目使用控制控制器方式实现代码如下 /// <summary> /// 用户权限控制 /// < ...
随机推荐
- ROR中h()方法和sanitize的区别及Html Filter
一般来说,通常使用input的field都会做一些filter的动作,避免被不怀好意之徒塞一些危险的HTML code(script等)进去搞破坏.在ROR中,我们在前面加一个h()(一般不用括号?不 ...
- 2019.2.1 现有vue-cli项目引入ESLint
ESLint 不管是多人合作还是个人项目,代码规范是很重要的.这样做不仅可以很大程度地避免基本语法错误,也保证了代码的可读性. 可能在早期建立项目的时候,因为一些原因没有引入eslint.单元测试等, ...
- JAVA-7NIO之Socket/ServerSocket Channel
一.ServerSocketChannel Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样.Ser ...
- [CQOI 2018]破解D-H协议
Description 题库链接 给出 \(A,B,P,g\) ,\(g\) 是 \(P\) 的原根,求出 \(A\equiv g^a\pmod{P}\) , \(B\equiv g^b\pmod{P ...
- python学习之类和实例的属性;装饰器@property
无论是类还是实例,一切皆是对象. Python是强动态语言,和java在这点上有所不同. class Ab(): a = 666 # 定义类对象Ab,自带属性a,值为666 # 使用Ab.__dict ...
- javascript加上标签
在javascript脚本中可以加上标签,方便javascript程序进行快速定位,标签一般由一个合法的字符名称加上一个冒号组成,标签可以放在任意行的位置,这样可以为该行设置一个标记,然后再 结构体中 ...
- Json.Net组件指定/忽略序列化字段属性技巧知识点
我们在用Json.Net序列化组件序列化类的时候,经常有这样的一个需求:指定被序列化类中的某些字段属性是要忽略的,或者是指定字段属性序列化 比如下面这个类: public class Bar { pu ...
- [PHP] 重回基础(IO流)
IO流用来处理设备之间的数据传输 java对数据的操作是通过流的方式 java用于操作流的对象都在IO包中 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流 字符流 抽象基类:Rea ...
- java编写带头结点的单链表
最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...
- mybatis之使用注解
注解 使用对象 相对应的 XML 描述 @CacheNamespace 类 <cache> 为给定的命名空间(比如类)配置缓存.属性有:implemetation, eviction, f ...