SSO单点登录的PHP实现方法(Laravel框架)


Posted in PHP onMarch 23, 2016

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。

简单说一下我的逻辑,我也不知道我理解sso对不对。

假如三个站点 a.baidu.com b.baidu.com c.baidu.com

a.baidu.com 作为验证用户登录账户。

b和c作为客户端(子系统)。

b和c需要登录的时候跳转到a,并且携带参数source指明登陆后跳转的链接。

a站点就是普通的登陆方式(校验用户密码),校验成功后做一些处理。需要生成一个ticket,具体怎么生成都可以,只要安全就可以了。然后存储到Cache里面。这里有疑问,后面总结。登陆成功后直接跳转到\(url就可以了。

``` php private function getTicketUrl(\)source)
{
\(ticket = md5(time()+key); Cache::put(\)ticket, $user, 120);
$url = $source . '?ticket=' . $ticket;
return $url;
}

假如说a站带着ticket跳转到b站(b.baidu.com?ticket=xxxxxxxxxxxxxxxx```)

b站做一个全局的过滤器,接受这个ticket然后请求a站验证ticket是否为a生成的。

b站过滤器App\Http\Middleware\CasAuthenticate代码,这里判断是否有ticket并发送请求到a站校验。如果是登陆的,则拿到用户UID进行登陆。

public function handle($request, Closure $next)
{
$ticket = $request->input('ticket');
if ($ticket) {
$result = json_decode('http://a.baidu.com' . '/auth/check-ticket?ticket=' . $ticket), true);
if ($result['state'] == "SUCCESS") {
$request->session()->flush();
Auth::loginUsingId($result['result']['uid']);
return redirect(redirect()->getUrlGenerator()->current());
}
}
return $next($request);
}

逻辑算是完成了,但是有几个疑问。

1.我这个实现,我自己都不知道是不是对的,这是我根据原理写出来的。

2.假如b站现在跳转到c站,由于b站活跃比较频繁,session一直都在,而a站的缓存时间极有可能已经过期了,此时从b站跳转到c站,c站跳转到a站去判断登陆,结果发现已经失效了,还是得登陆。所以这是有问题的,由于我们业务模块相关性差,不会随意跳转,所以暂不考虑这样的问题。但这确实是我的一个问题。我没想清楚。

有关SSO单点登录的PHP实现方法(Laravel框架),小编就给大家介绍这么多,希望对大家有所帮助!

PHP 相关文章推荐
我的论坛源代码(五)
Oct 09 PHP
将文件夹压缩成zip文件的php代码
Dec 14 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
PHP编译安装中遇到的两个错误和解决方法
Aug 20 PHP
php自定文件保存session的方法
Dec 10 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 PHP
laravel框架与其他框架的详细对比
Oct 23 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 PHP
Zend Framework开发入门经典教程
Mar 23 #PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
Mar 23 #PHP
Zend Framework教程之Zend_Config_Ini用法分析
Mar 23 #PHP
PHP正则获取页面所有图片地址
Mar 23 #PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 #PHP
php获取文件后缀的9种方法
Mar 22 #PHP
Zend Framework教程之Zend_Registry对象用法分析
Mar 22 #PHP
You might like
实用函数9
2007/11/08 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
2018/04/21 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
jquery垂直公告滚动实现代码
2013/12/08 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python数据结构之列表和元组的详解
2017/09/23 Python
TensorFlow变量管理详解
2018/03/10 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
python读取Excel实例详解
2018/08/17 Python
python 重命名轴索引的方法
2018/11/10 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
详解Django admin高级用法
2019/11/06 Python
pymysql的简单封装代码实例
2020/01/08 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
公司承诺书怎么写
2014/05/24 职场文书
村安全生产责任书
2014/08/25 职场文书
职位证明模板
2015/06/23 职场文书
珍爱生命主题班会
2015/08/13 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android
【js设计模式】SOLID五大设计原则
2022/03/24 Javascript
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby