PHP编程 SSO详细介绍及简单实例


Posted in PHP onJanuary 13, 2017

PHP SSO详解

SSO有三种模式:①跨子域单点登陆②完全跨单点域登陆③站群共享身份认证

第一种模式很简单,只需要将Cookie的域设置成多个应用的根域即可

第二种方式,也很简单,就是将所以应用的认证地址更换成同一个认证地址,每次查看是否在认证中心登陆,如果登陆了,给调用应用发放一个加密令牌即可

第三种跨域,就是来回跳转来回验证token略有麻烦

配置目录结构

在服务器根目录下,新建三个项目目录:

|?/网站根目录/
|?|?/oa/
|?|?/bbs/
|?|?/blog/

在根目录下新建functions.PHP脚本文件,具体内容如下:

<?php

/**
 * 获取登陆token
 * @param string $url 获取token的地址
 * 2017-01-03T13:08:43+0800
 */
function getToken($url)
{
  $bool = isLogin();
  if ($bool) {
    // 如果登陆了跳转到本站首页
    header('location: index.php');
    exit();
  }

  // 否则没有登陆,去另一个站点看是否登陆
  header('location: '.$url);
}

// 校验令牌是否正确
function yzToken($domain)
{
  $url = isset($_GET['url']) ? $_GET['url'] : '';
  $username = isset($_GET['username']) ? $_GET['username'] : '';
  $token = isset($_GET['token']) ? $_GET['token'] : '';


  if (!empty($username) && !empty($token)) {
    $salt = 'taoip';
    $_token = md5($salt.$username);
    // 校验第三方站点过来时的token是否正确
    if ($_token == $token) {
      // 设置跳转过来的网站的Cookie
      setCook($username, $_token, $domain);
      header('location: index.php');
    }
  }

}

// 设置cookie
function setCook($username, $_password, $domain)
{
  // 校验成功,开始登陆
  setcookie('username', $username, time()+3600, '/', $domain);
  setcookie('token', $_password, time()+3600, '/', $domain);
  header('location: index.php');
}

// 判断是否登陆
function isLogin()
{
  $username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
  $token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';
  $salt = 'taoip';

  $_token = md5($salt.$username);

  if ($token == $_token) {
    return true;
  } else {
    return false;
  }
}

?>

在oa项目目录下,新建index.php和login.php两个脚本文件

编辑index.php文件

<?php

// OA站点

// (1)开启Session会话
session_name('taoip');
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
$token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';

$salt = 'taoip';

$_token = md5($salt.$username);

if ($token != $_token) {
  header('location: login.php');
  exit();
}

echo "欢迎{$username}用户,访问OA站点";

?>

编辑login.php文件

<?php

// OA站点登陆系统
require '../functions.php';

// (2)验证
yzToken('taoip.cn');

// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET['url']) ? $_GET['url'] : '';
if (empty($url)) {
  getToken('http://dengpeng.cc/login.php?url=http://oa.taoip.cn/login.php');
}

// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET['url']) ? $_GET['url'] : '';
if ($bool) {
  if (empty($url)) {
    header('location: index.php');
  } else {
    $username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
    $token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';
    $lurl = $url.'?username='.$username.'&token='.$token;
    header('location: '.$lurl);
  }
}


if (!empty($_POST)) {
  $username = isset($_POST['username']) ? $_POST['username'] : '';
  $password = isset($_POST['password']) ? $_POST['password'] : '';

  // 从库中查询用户密码
  @$link = mysql_connect('localhost', 'root', '');
  mysql_query('use sso', $link);
  mysql_query('set names utf8', $link);
  $sql = "select * from users where username = '".$username."'";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));

  // 校验
  $salt = 'taoip';
  $_password = md5($salt.$username);

  // var_dump($user['password'] == $_password);
  // print_r($user);exit();

  if ($user['password'] == $_password) {
    // 校验成功,开始登陆
    setcookie('username', $username, time()+3600, '/', 'taoip.cn');
    setcookie('token', $_password, time()+3600, '/', 'taoip.cn');
    // 如果URL没有值重定向到首页,否则重定向到URL页面
    if (empty($url)) {
      header('location: index.php');
    } else {
      header('location: '.$lurl);
    }
  }
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>OA站点登陆系统</title>
</head>
<body>
  <div class="container">
    <h2>oa.taoip.cn站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </div>
</body>
</html>

在bbs项目目录下,新建index.php和login.php两个脚本文件

编辑index.php文件

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// BBS站点

// (1)开启Session会话
session_name('taoip');
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
$token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';

$salt = 'taoip';

$_token = md5($salt.$username);

if ($token != $_token) {
  header('location: login.php');
  exit();
}

echo "欢迎{$username}用户,访问BBS站点";

?>

编辑login.php文件

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// BBS站点登陆系统
require '../functions.php';

// (2)验证
yzToken('taoip.cn');

// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET['url']) ? $_GET['url'] : '';
if (empty($url)) {
  getToken('http://dengpeng.cc/login.php?url=http://bbs.taoip.cn/login.php');
}

// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET['url']) ? $_GET['url'] : '';
if ($bool) {
  if (empty($url)) {
    header('location: index.php');
  } else {
    $username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
    $token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';
    $lurl = $url.'?username='.$username.'&token='.$token;
    header('location: '.$lurl);
  }
}


if (!empty($_POST)) {
  $username = isset($_POST['username']) ? $_POST['username'] : '';
  $password = isset($_POST['password']) ? $_POST['password'] : '';

  // 从库中查询用户密码
  @$link = mysql_connect('localhost', 'root', '');
  mysql_query('use sso', $link);
  mysql_query('set names utf8', $link);
  $sql = "select * from users where username = '".$username."'";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));

  // 校验
  $salt = 'taoip';
  $_password = md5($salt.$username);

  // var_dump($user['password'] == $_password);
  // print_r($user);exit();

  if ($user['password'] == $_password) {
    // 校验成功,开始登陆
    setcookie('username', $username, time()+3600, '/', 'taoip.cn');
    setcookie('token', $_password, time()+3600, '/', 'taoip.cn');
    // 如果URL没有值重定向到首页,否则重定向到URL页面
    if (empty($url)) {
      header('location: index.php');
    } else {
      header('location: '.$lurl);
    }
  }
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>BBS站点登陆系统</title>
</head>
<body>
  <div class="container">
    <h2>bbs.taoip.cn站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </div>
</body>
</html>

在blog项目目录下,新建index.php和login.php两个脚本文件

编辑index.php文件

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// blog站点

// (1)开启Session会话
session_name('taoip');
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
$token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';

$salt = 'taoip';

$_token = md5($salt.$username);

if ($token != $_token) {
  header('location: login.php');
  exit();
}

echo "欢迎{$username}用户,访问blog站点";

?>

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// blog站点

// (1)开启Session会话
session_name('taoip');
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
$token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';

$salt = 'taoip';

$_token = md5($salt.$username);

if ($token != $_token) {
  header('location: login.php');
  exit();
}

echo "欢迎{$username}用户,访问blog站点";

?>

编辑login.php文件

<?php
/**
 * @author DengPeng <3@dengpeng.cc>
 * @since 2017/01/03
 * @copyright copyright (c) 2017 zixue.it GPL
 * @license http://www.zixue.it/
 */

// blog站点登陆系统
require '../functions.php';

// (2)验证
yzToken('dengpeng.cc');

// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET['url']) ? $_GET['url'] : '';
if (empty($url)) {
  getToken('http://oa.taoip.cn/login.php?url=http://dengpeng.cc/login.php');
}


// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET['url']) ? $_GET['url'] : '';
if ($bool) {
  if (empty($url)) {
    header('location: index.php');
  } else {
    $username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
    $token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';
    $lurl = $url.'?username='.$username.'&token='.$token;
    header('location: '.$lurl);
  }
}


// (3)判断用户是否提交数据
if (!empty($_POST)) {
  $username = isset($_POST['username']) ? $_POST['username'] : '';
  $password = isset($_POST['password']) ? $_POST['password'] : '';

  // 从库中查询用户密码
  @$link = mysql_connect('localhost', 'root', '');
  mysql_query('use sso', $link);
  mysql_query('set names utf8', $link);
  $sql = "select * from users where username = '".$username."'";
  $user = mysql_fetch_assoc(mysql_query($sql, $link));

  // 校验
  $salt = 'taoip';
  $_password = md5($salt.$username);

  // var_dump($user['password'] == $_password);
  // print_r($user);exit();

  if ($user['password'] == $_password) {
    setCook($username, $_password, 'dengpeng.cc');
    if (empty($url)) {
      header('location: index.php');
    } else {
      header('location: '.$lurl);
    }
  }
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="generator" content="Sublime Text 3114">
  <meta name="author" content="3@dengpeng.cc">
  <meta name="keywords" content="">
  <meta name="description" content="">
  <title>blog站点登陆系统</title>
</head>
<body>
  <div class="container">
    <h2>dengpeng.cc站点登陆系统</h2>
    <form action="" method="post">
      <label for="">用户名</label>
      <input type="text" name="username">
      <br>
      <label for="">密码</label>
      <input type="text" name="password">
      <hr>
      <button type="submit">提交</button>
    </form>
  </div>
</body>
</html>

配置本地虚拟主机

具体配置步骤,我想大家应该都会了,不需要我一一赘述.你只需要按照我给的参照,配置和不同域名对应目录的映射即可.

域名 /项目目录/
oa.taoip.cn /oa/
bbs.taoip.cn /bbs/
dengpeng.cc /blog/

恭喜您,已经完成了一个简单的SSO系统

配置完成后,记得重启Web服务器.然后你只需要访问这三个不同的站点,即可实现一个站点登陆,其他站点不再发送登陆请求.

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
一个数据采集类
Feb 14 PHP
php 删除cookie和浏览器重定向
Mar 16 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
教你如何快捷的使用cmd访问mysql小技巧
May 26 PHP
php猴子选大王问题解决方法
May 12 PHP
深入理解PHP内核(一)
Nov 10 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
open_basedir restriction in effect. 原因与解决方法
Mar 14 PHP
php 解决扫描二维码下载跳转问题
Jan 13 #PHP
PHP使用递归算法无限遍历数组示例
Jan 13 #PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
Jan 13 #PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 #PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 #PHP
Yii2实现增删改查后留在当前页的方法详解
Jan 13 #PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 #PHP
You might like
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
Bootstrap精简教程
2015/11/27 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
Ant Design moment对象和字符串之间的相互转化教程
2020/10/27 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
在Python中使用元类的教程
2015/04/28 Python
Python3实现购物车功能
2018/04/18 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
高二地理教学反思
2014/01/24 职场文书
荷叶圆圆教学反思
2014/02/01 职场文书
手工社团活动方案
2014/02/17 职场文书
优秀班主任材料
2014/12/16 职场文书
2016国培研修心得体会
2016/01/08 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js
openstack中的rpc远程调用的方法
2021/07/09 Python
浅谈MySQL函数
2021/10/05 MySQL
Python中三种花式打印的示例详解
2022/03/19 Python
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库