sso单点登录的PHP实现(Laravel框架)
2016-03-22 21:07
483 查看
简单说一下我的逻辑,我也不知道我理解sso对不对。
假如三个站点 a.baidu.com b.baidu.com c.baidu.com
a.baidu.com 作为验证用户登录账户。
b和c作为客户端(子系统)。
b和c需要登录的时候跳转到a,并且携带参数source指明登陆后跳转的链接。
a站点就是普通的登陆方式(校验用户密码),校验成功后做一些处理。需要生成一个ticket,具体怎么生成都可以,只要安全就可以了。然后存储到Cache里面。这里有疑问,后面总结。登陆成功后直接跳转到$url就可以了。
假如说a站带着ticket跳转到b站(
b站做一个全局的过滤器,接受这个ticket然后请求a站验证ticket是否为a生成的。
b站过滤器
逻辑算是完成了,但是有几个疑问。
1.我这个实现,我自己都不知道是不是对的,这是我根据原理写出来的。
2.假如b站现在跳转到c站,由于b站活跃比较频繁,session一直都在,而a站的缓存时间极有可能已经过期了,此时从b站跳转到c站,c站跳转到a站去判断登陆,结果发现已经失效了,还是得登陆。所以这是有问题的,由于我们业务模块相关性差,不会随意跳转,所以暂不考虑这样的问题。但这确实是我的一个问题。我没想清楚。
转载注明:罗志强的博客
假如三个站点 a.baidu.com b.baidu.com c.baidu.com
a.baidu.com 作为验证用户登录账户。
b和c作为客户端(子系统)。
b和c需要登录的时候跳转到a,并且携带参数source指明登陆后跳转的链接。
a站点就是普通的登陆方式(校验用户密码),校验成功后做一些处理。需要生成一个ticket,具体怎么生成都可以,只要安全就可以了。然后存储到Cache里面。这里有疑问,后面总结。登陆成功后直接跳转到$url就可以了。
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站去判断登陆,结果发现已经失效了,还是得登陆。所以这是有问题的,由于我们业务模块相关性差,不会随意跳转,所以暂不考虑这样的问题。但这确实是我的一个问题。我没想清楚。
转载注明:罗志强的博客
相关文章推荐
- 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况
- 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况
- 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况
- PHP中如何获取字符串的长度
- PHP设计模式
- ThinkPHP框架下基于RBAC的权限控制模式详解
- php生成的csv, 无法完整显示带前导0的数字
- yaf目录的大小写配置篇
- tps (事务处理系统)
- [PHP]文件系统
- 字符串处理函数
- PHP调用内容DES加密的SOAP接口
- A+B for Input-Output Practice (VIII)
- A+B for Input-Output Practice (VII)
- A+B for Input-Output Practice (VI)
- 【PHP】简单的登陆验证和权限管理
- 验证码制作php
- php 错误处理
- php设计模式学习系列(九)--桥接模式
- 在WAMPSERVER下增加多版本的PHP(PHP5.4,PHP5.6)支持