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

PHP SSO详解

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

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

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

配置目录结构

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

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

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

rush: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',$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文件

rush: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文件

rush: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','taoip.cn');
setcookie('token','taoip.cn');
// 如果URL没有值重定向到首页,否则重定向到URL页面
if (empty($url)) {
header('location: index.php');
} else {
header('location: '.$lurl);
}
}
}

?>

<!DOCTYPE html>
<html lang="en">

<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=""> OA<a href="https://www.jb51.cc/tag/zhandian/" target="_blank" class="keywords">站点</a>登陆系统
oa.taoip.cn站点登陆系统

用户名

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

编辑index.PHP文件

rush: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文件

rush: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',否则重定向到URL页面
if (empty($url)) {
header('location: index.PHP');
} else {
header('location: '.$lurl);
}
}
}

?>

<!DOCTYPE html>
<html lang="en">

<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=""> BBS<a href="https://www.jb51.cc/tag/zhandian/" target="_blank" class="keywords">站点</a>登陆系统
bbs.taoip.cn站点登陆系统 用户名

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

编辑index.PHP文件

rush: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
/**

// 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文件

rush: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',$link));

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

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

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

?>

<!DOCTYPE html>
<html lang="en">

<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=""> blog<a href="https://www.jb51.cc/tag/zhandian/" target="_blank" class="keywords">站点</a>登陆系统
dengpeng.cc站点登陆系统 用户名

配置本地虚拟主机

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用