1.准备两个虚拟域名

127.0.0.1  www.openpoor.com

127.0.0.1  www.myspace.com

2.在openpoor的根目录下创建以下文件

index.PHP

  1. [php] view plain copy
  2. <?php
  3. session_start();
  4. ?>
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta charset="UTF-8"/>
  9. <title>sync login</title>
  10. </head>
  11. <body>
  12. <?php if(empty($_SESSION['username'])):?>
  13. hello,游客;请先<a href="login.php">登录</a><a href="http://www.myspace.com/index.php">进入空间</a>
  14. <?php else: ?>
  15. hello,<?php echo $_SESSION['username']; ?>;<a href="http://www.myspace.com/index.php">进入空间</a>
  16. <?php endif; ?>
  17. <a href="http://www.openpoor.com/index.php">home</a>
  18. </body>
  19. </html>

login.php

  1. <?php
  2. session_start();
  3. if(!empty($_POST['username'])){
  4. require '../Des.php';
  5. $_SESSION['username'] = $_POST['username'];
  6. $redirect = 'http://www.openpoor.com/index.php';
  7. header('Location:http://www.openpoor.com/sync.php?redirect='.urlencode($redirect).'&code='.Des::encrypt($_POST['username'],'openpoor'));exit;
  8. }
  9. ?>
  10. <!DOCTYPE html>
  11. <html>
  12. <head>
  13. <meta charset="UTF-8"/>
  14. <title>sync login</title>
  15. </head>
  16. <body>
  17. <form action="" method="post">
  18. <input type="text" name="username" placeholder="用户名"/>
  19. <input type="text" name="password" placeholder="密码"/>
  20. <input type="submit" value="登录"/>
  21. </form>
  22. </body>
  23. </html>

sync.php

  1. <?php
  2. $redirect = empty($_GET['redirect']) ? 'www.openpoor.com' : $_GET['redirect'];
  3. if(empty($_GET['code'])){
  4. header('Loaction:http://'.urldecode($redirect));
  5. exit;
  6. }
  7. $apps = array(
  8. 'www.myspace.com/slogin.php'
  9. );
  10. ?>
  11. <!DOCTYPE html>
  12. <html>
  13. <head>
  14. <meta charset="UTF-8"/>
  15. <?php foreach($apps as $v): ?>
  16. <script type="text/javascript" src="http://<?php echo $v.'?code='.$_GET['code'] ?>"></script>
  17. <?php endforeach; ?>
  18. <title>passport</title>
  19. </head>
  20. <body>
  21. <script type="text/javascript">
  22. window.onload=function(){
  23. location.replace('<?php echo $redirect; ?>');
  24. }
  25. </script>
  26. </body>
  27. </html>

3.在myspace的根目录下创建如下文件

slogin文件 完成session的设置

  1. <?php
  2. session_start();
  3. header('Content-Type:text/javascript; charset=utf-8');
  4. if(!empty($_GET['code'])){
  5. require '../Des.php';
  6. $username = Des::decrypt($_GET['code'],'openpoor');
  7. if(!empty($username)){
  8. header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
  9. $_SESSION['username'] = $username;
  10. }
  11. }
  12. ?>

index.php

[php] view
plain
 copy

  1. <?php
  2. session_start();
  3. if(!empty($_SESSION['username']))
  4. {
  5. echo "欢迎来到".$_SESSION['username']."的空间";
  6. }else{
  7. echo "请先登录";
  8. }
  9. ?>

4.Des.php的文件内容如下

  1. <?php
  2. /**
  3. *@see Yii CSecurityManager;
  4. */
  5. class Des{
  6. public static function encrypt($data,$key){
  7. $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
  8. $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
  9. srand();
  10. $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);
  11. mcrypt_generic_init($module,$key,$iv);
  12. $encrypted=$iv.mcrypt_generic($module,$data);
  13. mcrypt_generic_deinit($module);
  14. mcrypt_module_close($module);
  15. return md5($data).'_'.base64_encode($encrypted);
  16. }
  17. public static function decrypt($data,$key){
  18. $_data = explode('_',$data,2);
  19. if(count($_data)<2){
  20. return false;
  21. }
  22. $data = base64_decode($_data[1]);
  23. $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
  24. $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
  25. $ivSize=mcrypt_enc_get_iv_size($module);
  26. $iv=substr($data,0,$ivSize);
  27. mcrypt_generic_init($module,$key,$iv);
  28. $decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data)));
  29. mcrypt_generic_deinit($module);
  30. mcrypt_module_close($module);
  31. $decrypted = rtrim($decrypted,"\0");
  32. if($_data[0]!=md5($decrypted)){
  33. return false;
  34. }
  35. return $decrypted;
  36. }
  37. }
  38. ?>

当在openpoor登录后将session信息传到其他域名下的文件下进行处理,以script标签包含的形式进行运行。

5.此时访问www.openpoor.com和www.myspace.com都是未登录状态

登录后两个域名下都是登录状态

到此我们实现了一个简单的单点登录。

使用php实现单点登录的更多相关文章

  1. 著名ERP厂商的SSO单点登录解决方案介绍一

          SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...

  2. 看图理解JWT如何用于单点登录

    单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...

  3. 细说SSO单点登录

    什么是SSO? 如果你已知道,请略过本节! SSO核心意义就一句话:一处登录,处处登录:一处注销,处处注销.即:在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很多人容易把SS ...

  4. [原创]django+ldap+memcache实现单点登录+统一认证

    前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...

  5. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  6. CAS FOR WINDOW ACTIVE DIRECTORY SSO单点登录

    一.CAS是什么? CAS(Central Authentication Service)是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(支持 ...

  7. 单点登录改进版-使用ajax分发cookie避免重定向轮询

    前言 继上一篇博文:可跨域的单点登录(SSO)实现方案[附.net代码]虽然实现了单点登录,也存在很多不合理的地方.很多热心的朋友也给出了很多指导性的意见,特别是 LoveCoder提出的意见. 在很 ...

  8. 可跨域的单点登录(SSO)实现方案【附.net代码】

    SSO简介 定义: 传统的单站点登录访问授权机制是:登录成功后将用户信息保存在session中,sessionId保存在cookie中,每次访问需要登录访问的资源(url)时判断当前session是否 ...

  9. .net 单点登录实践

    前言 最近轮到我在小组晨会来分享知识点,突然想到单点登录,准备来分享下如何实现单点登录,所以有了下文.实现方案以及代码可能写得不是很严谨,有漏洞的地方或者错误的地方欢迎大家指正. 刚开始头脑中没有思路 ...

  10. asp.net mvc 权限过滤和单点登录(禁止重复登录)

    1.权限控制使用controller和 action来实现,权限方式有很多种,最近开发项目使用控制控制器方式实现代码如下 /// <summary> /// 用户权限控制 /// < ...

随机推荐

  1. Python实例1-Collatz 序列

    编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数,那么 collatz()就打印出 number // 2, 并返回该值.如果 number 是奇数, col ...

  2. CSS 的overflow:hidden (清除浮动)

    verflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很 了解.一提到清除浮动,我们就会想到另外一个CSS样式: ...

  3. ssm项目 maven 项目pon.xml 配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. 路飞学城-Python爬虫集训-第一章

    自学Python的时候看了不少老男孩的视频,一直欠老男孩一个会员,现在99元爬虫集训果断参与. 非常喜欢Alex和武Sir的课,技术能力超强,当然讲着讲着就开起车来也说明他俩开车的技术也超级强! 以上 ...

  5. vue:解决使用param传参后,再次刷新页面会新增一个原有的tab

    问题:在最近的项目中,我通过传递不同的参数,复用同一组件进行渲染,然而意外出现一个bug,就是当我重新刷新该页面时,会新增一个tab 原来的: 刷新页面后: 查阅资料后,发现该现象是由于通过param ...

  6. 深入浅出 Java Concurrency (23): 并发容器 part 8 可阻塞的BlockingQueue (3)[转]

    在Set中有一个排序的集合SortedSet,用来保存按照自然顺序排列的对象.Queue中同样引入了一个支持排序的FIFO模型. 并发队列与Queue简介 中介绍了,PriorityQueue和Pri ...

  7. 原生JS实现彩票36选7不重复(优化)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 关于使用注解设置token免拦截 和 必要 的权限拦截

    先说一下这样子做的原理:将某一个注解配置在方法头部,在spring实例化的时候会将注解以切面的形式注入给方法,在拦截的地方判断当前方法有没有注入指定的注解类. 1.先声明一个注解类(类中不需要做任何逻 ...

  9. Springboot2集成Activiti设计器并去除security

    前言 鉴于项目需要将acitiviti设计器整合到原工程中,在网上查了不少资料都不太适用,经过借鉴和自己倒腾终于搞定了,分享一下经验,如果有问题,可以在留言区咨询. 文中用到的资源代码链接: http ...

  10. Hibernate-一对多|多对一-多对多

    1 一对多|多对一 1.1 关系表达 表中的表达 表中的表达  实体中的表达 orm元数据中表达 一对多 多对一 1.2 操作 操作关联属性 1.3 进阶操作 级联操作 结论: 简化操作.一定要用,s ...