PHP编程 SSO详细介绍及简单实例
2018-09-21 11:36
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)验证; // (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token $url = isset($_GET[url]) ? $_GET[url] : ; if (empty($url)) { getToken(判断用户是否登陆 $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页面gt; <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 站点 // (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 站点登陆系统 require ../functions.php; // (2)验证 yzToken(taoip.cn); // (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token $url = isset($_GET[url]) ? $_GET[url] : ; if (empty($url)) { getToken(判断用户是否登陆 $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 站点 // (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 站点 // (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 站点登陆系统 require ../functions.php; // (2)验证 yzToken(dengpeng.cc); // (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token $url = isset($_GET[url]) ? $_GET[url] : ; if (empty($url)) { getToken(判断用户是否登陆 $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服务器.然后你只需要访问这三个不同的站点,即可实现一个站点登陆,其他站点不再发送登陆请求.
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!