PHP简单实现单点登录功能示例
1.准备两个虚拟域名
127.0.0.1 www.openpoor.com
127.0.0.1 www.myspace.com
2.在openpoor的根目录下创建以下文件
index.PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?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" rel= "external nofollow" >登录</a><a href= "http://www.myspace.com/index.php" rel= "external nofollow" rel= "external nofollow" >进入空间</a>
<?php else : ?>
hello,<?php echo $_SESSION [ 'username' ]; ?>;<a href= "http://www.myspace.com/index.php" rel= "external nofollow" rel= "external nofollow" >进入空间</a>
<?php endif ; ?>
<a href= "http://www.openpoor.com/index.php" rel= "external nofollow" >home</a>
</body>
</html>
|
login.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?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的设置
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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
1
2
3
4
5
6
7
8
9
|
<?php
session_start();
if (! empty ( $_SESSION [ 'username' ]))
{
echo "欢迎来到" . $_SESSION [ 'username' ]. "的空间" ;
} else {
echo "请先登录" ;
}
?>
|
4.Des.php的文件内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?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都是未登录状态
登录后两个域名下都是登录状态
到此我们实现了一个简单的单点登录。
转载于:https://www.cnblogs.com/matengfei123/p/9872351.html
PHP简单实现单点登录功能示例相关推荐
- php 单点登录实现代码,PHP简单实现单点登录功能示例
1.准备两个虚拟域名 127.0.0.1 www.openpoor.com 127.0.0.1 www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...
- 邮件服务器“单点登录”功能
现状分析: 相信我们每个人都有这样的经历,比方说银行卡多的人要具体记忆每张卡的密码挺麻烦:现代人兴 趣广泛,爱好多多,运动健身俱乐部.娱乐游戏休闲.购物理财等各种场合少不了获得入门的"通行证 ...
- Java 实现单点登录功能
J2EE社区 苟有恒,何必三更起五更眠; 最无益,只怕一日曝十日寒. posts - 238, comments - 317, trackbacks - 0, articles - 16 导航 首页 ...
- python读取json配置文件_Python简单读取json文件功能示例
本文实例讲述了Python简单读取json文件功能.分享给大家供大家参考,具体如下: read_json.json: { "rule":{ "namespace" ...
- c# 算式 计算器_C#实现的简单整数四则运算计算器功能示例
C#实现的简单整数四则运算计算器功能示例 发布时间:2020-08-24 00:11:14 来源:脚本之家 阅读:131 本文实例讲述了C#实现的简单整数四则运算计算器功能.分享给大家供大家参考,具体 ...
- java实现简单扫码登录功能(模仿微信网页版扫码)
java实现简单扫码登录功能 模仿微信pc网页版扫码登录 使用js代码生成qrcode二维码减轻服务器压力 js循环请求服务端,判断是否qrcode被扫 二维码超时失效功能 二维码被扫成功登录,服务端 ...
- JavaWeb简单的单点登录、验证码校验功能实现
前言 最近项目刚刚告一段落,后期有时间会慢慢分解整理出来给大家分享.本文主要提供思路和核心代码,建立在有一定后台基础读者上.(相信没有基础的同学只要认真细读也是可以理解的) 技术原理 1.单点登录(S ...
- Java实现简单的单点登录
摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...
- 单点登录原理和java实现简单的单点登录
摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...
最新文章
- javase-线程生命周期
- Mac-远程连接Mac
- Activity的用法(三):开启网页 (没有弹出浏览器,不清楚是什么原因)
- 利用TreeSet给纯数字字符串排序
- 【复杂网络】用户画像不应脱离社会关系,谈复杂网络的关键技术和应用实践
- 跳表(SkipList)设计与实现(java)
- 骁龙845_骁龙845为什么这么快就不受欢迎了?手机更新节奏有多快
- TCP/IP三次握手与四次握手
- java fileinputstream.read(byte[])_Java分享笔记:FileInputStream流的 read()方法 和 read(byte[] b)方法...
- Eclipse快捷键-方便查找
- python网页请求超时_python爬虫多次请求超时的几种重试方法(6种)
- java二进制 中文_Java 实现中文与二进制代码互转
- BZOJ2795/2890/3647 [Poi2012]A Horrible Poem 【字符串hash】
- 微信公众号自定义菜单
- openssl数据加密
- 原码一位乘法和补码一位乘法
- 计算机中1024换算单位,数据换算(计算机中数据的单位换算)
- 7万字总结Spring,这回能看懂Spring源码了!
- (BLE)蓝牙抓包(1) -nRF-sniffer和wireshark
- 视频剪辑计算机配置要求,对于视频剪辑工作,需要什么样的电脑配置才满足要求...
热门文章
- pandas处理csv
- 6号板编译失败找不到arm-none-linux-gnueabi-gcc
- IOS--文件管理NSFileManager
- 【Egret】Wing3发布移动APP功能,打包APK流程以及会遇到的问题
- Codeforces Round #344 (Div. 2) B. Print Check
- POJ 2386 Lake Counting DFS水水
- linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- C/C++中的运算符优先级总结
- python两个时间内的工作日_如何在Python中找到两个日期之间的星期一或任何其他工作日的数目?...