|
PHP SSO详解
SSO有三种模式:①跨子域单点登陆②完全跨单点域登陆③站群共享身份认证
第一种模式很简单,只需要将Cookie的域设置成多个应用的根域即可
第二种方式,也很简单,就是将所以应用的认证地址更换成同一个认证地址,每次查看是否在认证中心登陆,如果登陆了,给调用应用发放一个加密令牌即可
第三种跨域,就是来回跳转来回验证token略有麻烦
配置目录结构
在服务器根目录下,新建三个项目目录:
|–/网站根目录/
|–|–/oa/
|–|–/bbs/
|–|–/blog/
在根目录下新建functions.PHP脚本文件,具体内容如下:
在oa项目目录下,新建index.php和login.php两个脚本文件
编辑index.php文件
编辑login.php文件
OA站点登陆系统
oa.taoip.cn站点登陆系统
用户名
密码
提交
在bbs项目目录下,新建index.php和login.php两个脚本文件
编辑index.php文件
* @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文件
* @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);
}
}
}
?>
BBS站点登陆系统
bbs.taoip.cn站点登陆系统
用户名
密码
提交
在blog项目目录下,新建index.php和login.php两个脚本文件
编辑index.php文件
* @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站点";
?>
* @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文件
* @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);
}
}
}
?>
blog站点登陆系统
dengpeng.cc站点登陆系统
用户名
密码
提交
配置本地虚拟主机
具体配置步骤,我想大家应该都会了,不需要我一一赘述.你只需要按照我给的参照,配置和不同域名对应目录的映射即可.
域名 /项目目录/
oa.taoip.cn /oa/
bbs.taoip.cn /bbs/
dengpeng.cc /blog/
恭喜您,已经完成了一个简单的SSO系统
配置完成后,记得重启Web服务器.然后你只需要访问这三个不同的站点,即可实现一个站点登陆,其他站点不再发送登陆请求.
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:推荐学习php sesson的朋友必看PHP会话(Session)使用入门php中处理mysql_fetch_assoc返回来的数组 不用foreach----echoPHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别php的sso单点登录实现方法PHP中SSO Cookie登录分析和实现SSO单点登录的PHP实现方法(Laravel框架)php实现的SSO单点登录系统接入功能示例分析php array_udiff_assoc 计算两个数组的差集实例
|
|