zoukankan      html  css  js  c++  java
  • sso单点登录的PHP实现(Laravel框架)

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

    假如三个站点 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站过滤器AppHttpMiddlewareCasAuthenticate代码,这里判断是否有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站去判断登陆,结果发现已经失效了,还是得登陆。所以这是有问题的,由于我们业务模块相关性差,不会随意跳转,所以暂不考虑这样的问题。但这确实是我的一个问题。我没想清楚。

    转载注明:罗志强的博客

  • 相关阅读:
    Linux 实例如何开启 MySQL 慢查询功能
    20步打造最安全的Nginx Web服务器
    解决java compiler level does not match the version of the installed java project facet
    maven项目重构目录
    【JeeSite】角色和权限的修改
    【JeeSite】区域和菜单管理
    【JeeSite】登录和主题切换
    【JeeSite】用户管理
    一个程序员的故事
    maven项目发布到Tomcat丢失jar包
  • 原文地址:https://www.cnblogs.com/showstyle/p/5308475.html
Copyright © 2011-2022 走看看