PHP编程 SSO详细介绍及简单实例
发布时间 - 2026-01-10 22:31:20 点击率:次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编程
# SSO
# SSO详细介绍
# SSO实例
# php array_udiff_assoc 计算两个数组的差集实例
# php实现的SSO单点登录系统接入功能示例分析
# SSO单点登录的PHP实现方法(Laravel框架)
# PHP中SSO Cookie登录分析和实现
# php的sso单点登录实现方法
# php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fet
# PHP数组的交集array_intersect()
# array_intersect_assoc()
# array_inter_key()函数的小问题
# php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
# 推荐学习php sesson的朋友必看PHP会话(Session)使用入门
# 首页
# 跳转
# 单点
# 重定向
# 判断是否
# 库中
# 令牌
# 目录下
# 是否正确
# 你只需要
# 我想
# 多个
# 不需要
# 我一
# 只需
# 也很
# 希望能
# 很简单
# 我给
# 要将
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
香港服务器建站指南:免备案优势与SEO优化技巧全解析
如何用腾讯建站主机快速创建免费网站?
如何彻底卸载建站之星软件?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Android自定义控件实现温度旋转按钮效果
清除minerd进程的简单方法
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
如何挑选优质建站一级代理提升网站排名?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
Laravel中的withCount方法怎么高效统计关联模型数量
打造顶配客厅影院,这份100寸电视推荐名单请查收
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
EditPlus中的正则表达式 实战(1)
JS实现鼠标移上去显示图片或微信二维码
移动端脚本框架Hammer.js
如何在景安服务器上快速搭建个人网站?
Laravel怎么实现验证码(Captcha)功能
如何快速登录WAP自助建站平台?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
如何在香港服务器上快速搭建免备案网站?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Laravel如何优化应用性能?(缓存和优化命令)
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
在centOS 7安装mysql 5.7的详细教程
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
什么是javascript作用域_全局和局部作用域有什么区别?
Laravel怎么使用Intervention Image库处理图片上传和缩放
Laravel怎么上传文件_Laravel图片上传及存储配置
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
详解CentOS6.5 安装 MySQL5.1.71的方法
WordPress 子目录安装中正确处理脚本路径的完整指南
图册素材网站设计制作软件,图册的导出方式有几种?
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
,网页ppt怎么弄成自己的ppt?
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
php打包exe后无法访问网络共享_共享权限设置方法【教程】
网站图片在线制作软件,怎么在图片上做链接?
jQuery中的100个技巧汇总
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何续费美橙建站之星域名及服务?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
百度浏览器如何管理插件 百度浏览器插件管理方法
BootStrap整体框架之基础布局组件
如何基于PHP生成高效IDC网络公司建站源码?
香港服务器租用每月最低只需15元?
独立制作一个网站多少钱,建立网站需要花多少钱?
JavaScript数据类型有哪些_如何准确判断一个变量的类型

