php实现单点登录实例

Posted 李留广

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php实现单点登录实例相关的知识,希望对你有一定的参考价值。

1.准备两个虚拟域名

127.0.0.1 www.a.com
127.0.0.1 www.b.com

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

 

技术图片
  1 //index.php
  2 
  3 <?php
  4 session_start();
  5 ?>
  6 <!DOCTYPE html>
  7 <html>
  8 <head>
  9     <meta charset="UTF-8"/>
 10     <title>sync login</title>
 11 </head>
 12 <body>
 13 
 14 <?php if(empty($_SESSION[‘username‘])):?>
 15     <p>hello,游客;请先<a href="login.php">登录</a></p>
 16     <p><a href="http://www.b.com/index.php">进入空间</a></p>
 17 <?php else: ?>
 18     <p>hello,<?php echo $_SESSION[‘username‘]; ?>;<a href="http://www.b.com/index.php">进入空间</a></p>
 19 <?php endif; ?>
 20 <a href="http://www.a.com/index.php">home</a>
 21 </body>
 22 </html>
 23 
 24 //login.php
 25 <?php
 26 session_start();
 27 if(!empty($_POST[‘username‘])){
 28     require ‘./Des.php‘;
 29     $_SESSION[‘username‘] = $_POST[‘username‘];
 30     $redirect = ‘http://www.a.com/index.php‘;
 31     header(‘Location:http://www.a.com/sync.php?redirect=‘.urlencode($redirect).‘&code=‘.Des::encode($_POST[‘username‘],‘a‘));
 32     exit;
 33 }
 34 ?>
 35 <!DOCTYPE html>
 36 <html>
 37 <head>
 38     <meta charset="UTF-8"/>
 39     <title>sync login</title>
 40 </head>
 41 <body>
 42 <form action="" method="post">
 43     <input type="text" name="username" placeholder="用户名"/>
 44     <input type="text" name="password" placeholder="密码"/>
 45     <input type="submit" value="登录"/>
 46 </form>
 47 </body>
 48 </html>
 49 
 50 //sync.php
 51 <?php
 52 $redirect = empty($_GET[‘redirect‘]) ? ‘www.a.com‘ : $_GET[‘redirect‘];
 53 if (empty($_GET[‘code‘])) {
 54     header(‘Loaction:http://‘ . urldecode($redirect));
 55     exit;
 56 }
 57 
 58 $apps = array(
 59     ‘www.b.com/slogin.php‘
 60 );
 61 ?>
 62 <!DOCTYPE html>
 63 <html>
 64 <head>
 65     <meta charset="UTF-8"/>
 66     <?php foreach ($apps as $v): ?>
 67         <script type="text/javascript" src="http://<?php echo $v . ‘?code=‘ . $_GET[‘code‘] ?>"></script>
 68     <?php endforeach; ?>
 69     <title>passport</title>
 70 </head>
 71 <body>
 72 <script type="text/javascript">
 73     window.onload = function () {
 74         location.replace(‘<?php echo $redirect; ?>‘);
 75     }
 76 </script>
 77 </body>
 78 </html>
 79 
 80 //Des.php
 81 //当在www.a.com登录后将session信息传到其他域名下的文件下进行处理,以script标签包含的形式进行运行。
 82 <?php
 83 
 84 class Des
 85 {
 86     /**
 87      * 简单对称加密算法之加密
 88      * @param String $string 需要加密的字串
 89      * @param String $skey   加密EKY
 90      * @return String
 91      */
 92     public static function encode($string = ‘‘, $skey = ‘cxphp‘)
 93     {
 94         $strArr   = str_split(base64_encode($string));
 95         $strCount = count($strArr);
 96         foreach (str_split($skey) as $key => $value) {
 97             $key < $strCount && $strArr[$key] .= $value;
 98         }
 99         return str_replace(array(‘=‘, ‘+‘, ‘/‘), array(‘O0O0O‘, ‘o000o‘, ‘oo00o‘), join(‘‘, $strArr));
100     }
101 
102     /**
103      * 简单对称加密算法之解密
104      * @param String $string 需要解密的字串
105      * @param String $skey   解密KEY
106      * @return String
107      */
108     public static function decode($string = ‘‘, $skey = ‘cxphp‘)
109     {
110         $strArr   = str_split(str_replace(array(‘O0O0O‘, ‘o000o‘, ‘oo00o‘), array(‘=‘, ‘+‘, ‘/‘), $string), 2);
111         $strCount = count($strArr);
112         foreach (str_split($skey) as $key => $value) {
113             $key <= $strCount && isset($strArr[$key]) && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0];
114         }
115         return base64_decode(join(‘‘, $strArr));
116     }
117 }
技术图片

 

3.在www.b.com的根目录下创建如下文件

 

技术图片
 1 //slogin.php文件 完成session的设置
 2 <?php
 3 session_start();
 4 header(‘Content-Type:text/javascript; charset=utf-8‘);
 5 if(!empty($_GET[‘code‘])){
 6     require ‘./Des.php‘;
 7     $username = Des::decode($_GET[‘code‘],‘a‘);
 8     if(!empty($username)){
 9         header(‘P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"‘);
10         $_SESSION[‘username‘] = $username;
11     }
12 }
13 ?>
14 
15 //index.php
16 <?php
17 session_start();
18 if(!empty($_SESSION[‘username‘]))
19 {
20     echo "欢迎来到".$_SESSION[‘username‘]."的空间";
21 }else{
22     echo "请先登录";
23 }
24 ?>
技术图片

4.此时访问www.a.com和www.b.com都是未登录状态
登录后两个域名下都是登录状态

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



以上是关于php实现单点登录实例的主要内容,如果未能解决你的问题,请参考以下文章

php实现SSO单点登录实例

php实现单点登录实例

php实现单点登录实例

使用php实现单点登录实例详解

使用php实现单点登录实例详解

php的sso单点登录实现方法