进一步优化Yii2跨域的SSO登录

字节弦歌
• 阅读 5513

序言

本文主要是对“关于Yii2如何实现跨域的SSO登录的解析”的改进,因为在那篇文章中我已经写出了SSO登录的基本实现过程,现在是进一步优化。主要优化的部分有两点:一、在www.XXX.com登录状态的页面地址栏上输入login.XXX.com的时候回到登录页面,但并不退出登录,再输入www.XXX.com的时候,让它又回到了www.XXX.com页面并保持登录的状态;二、修改session的过期时间,设置到极大值。

需求分析

1、输入login.XXX.com只是让它回到登录的界面,但并不会退出登录,session和cookie的值还是保存着的。
2、实现永久登录状态。只要不点击退出登录,就一直保持着登录状态。

代码分析

1、对login模块SiteController.php的Login方法修改
1.1、修改前代码

public function actionLogin()
        {   
            $URL=Yii::$app->request->get('redirectURL');  
            $model = new LoginForm();
            //判断是否已登录,非为登陆
            if (!\Yii::$app->user->isGuest) { 
                $this->actionLogout();//退出登录
                return $this->redirect('http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_HOME);
            } 
        
            if ($model->load(Yii::$app->request->post()) && $model->login()) {
                if(empty($URL)){
                    return $this->redirect('http://'.DOMAIN_HOME,301);
                }else{
                    return $this->redirect($URL,301);
                }           
                // return $this->goBack();
            } else { 
                return $this->renderPartial('login', [
                    'model' => $model,
                ]);
            }
        }

1.2、修改后代码

 public function actionLogin()
    {  
        $URL=Yii::$app->request->get('redirectURL');  
        $URL1='http://'.DOMAIN_CRM;
        $URL2='http://'.DOMAIN_HR;
        $URL3='http://'.DOMAIN_ADMIN;
        $URL4='http://'.DOMAIN_OA;
       
        $redirectURL1='http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_CRM;
        $redirectURL2='http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_HR;
        $redirectURL3='http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_ADMIN;
        $redirectURL4='http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_OA;
        $model = new LoginForm();

        //判断是否已登录,非为登陆
        if (!\Yii::$app->user->isGuest) { 
           if(!empty($URL)){
                $this->actionLogout();//退出登录
                if($URL==$URL2){
                    return $this->redirect($redirectURL2);
                }elseif($URL==$URL3){
                    return $this->redirect($redirectURL3);
                }
                if($URL==$URL4){
                    return $this->redirect($redirectURL4);
                }
                return $this->redirect($redirectURL1);

           }else{
                //redirectURL不存在时,提交表单判断
                if(DOMAIN_LOGIN){   
                   if ($model->load(Yii::$app->request->post()) && $model->login()) {
                        if(empty($URL)){ 
                            return $this->redirect($URL1,301);             
                        }else{
                            if($URL==$URL2){
                                return $this->redirect($URL2,301);
                            }elseif($URL==$URL3){
                                return $this->redirect($URL3,301);
                            }
                            if($URL==$URL4){
                                return $this->redirect($URL4,301);
                            }
                            return $this->redirect($URL1,301);
                        }           
                    } else { 
                        return $this->renderPartial('login', [
                            'model' => $model,
                        ]);
                    }
                }else{ 
                    return $this->goHome(); //与之前的代码主要的区别在这里,登录就让它回到登录页面。
                }  
           }  
        } else { 
            //redirectURL存在时,提交表单判断
            if ($model->load(Yii::$app->request->post()) && $model->login()) {
                if(empty($URL)){ 
                    return $this->redirect($URL1,301);             
                }else{
                    if($URL==$URL2){
                        return $this->redirect($URL2,301);
                    }elseif($URL==$URL3){
                        return $this->redirect($URL3,301);
                    }
                    if($URL==$URL4){
                        return $this->redirect($URL4,301);
                    }
                    return $this->redirect($URL1,301);
                }           
            } else { 
                return $this->renderPartial('login', [
                    'model' => $model,
                ]);
            }
        }
    }

2、修改session的过期时间,设置到极大值。
commonconfigmain.php
2.1、修改前代码

'session' => [           
            'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0],            
            'timeout' => 3600,
        ],

2.2、修改后代码

'session' => [           
            'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0],            
            'timeout' => 7200,
        ],

常见问题

1、虽然session的过期时间已经设置了极大值,登录成功cookie也有值了,但是登录后大约过两个小时左右还是会退出登录,为何会这样?Yii2如何实现真正的永久登录,还请大牛们解答,后续要是我解决了也会继续更新,一同进步。

相关资料

Yii2 配置 跨域登录实例:http://www.kuitao8.com/201505...
Yii2 如何利用redirect让页面自动跳转到外站?:https://segmentfault.com/q/10...

全文完,如有不足或者更好的方式方法,欢迎大家踊跃提出,我们一起相互交流学习。

点赞
收藏
评论区
推荐文章
CuterCorley CuterCorley
4年前
uni-app入门教程(7)第三方登录和分享
前言本文主要介绍了APP开发的两大基本功能,即第三方登录登录和分享:包括登录通用配置,微信小程序和APP的第三方登录方式,和分享到聊天和朋友圈,使用uniapp实现有不同的接口和实现方式。一、通用配置因为小程序和APP登录接口不同,需要在前端进行跨端兼容处理,同时微信等平台的小程序一般只支持所属宿主程序的第三方登录,而无法包括其他的
Wesley13 Wesley13
3年前
SSO单点登录学习总结(1)——单点登录(SSO)原理解析
SSO的概念:单点登录SSO(SingleSignOn)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。SSO的用途:目前的企业应用环境中,往往有很多的应用系统,
【实践篇】基于CAS的单点登录实践之路
上个月我负责的系统SSO升级,对接京东ERP系统,这也让我想起了之前我做过一个单点登录的项目。想来单点登录有很多实现方案,不过最主流的还是基于CAS的方案,所以我也就分享一下我的CAS实践之路。
Easter79 Easter79
3年前
TP、PHP同域不同子级域名共享Session、单点登录
目的:为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录。PHP支持通过设置cookie使得同域不同子域共享SESSION1\.通过在执行PHP的入口文件中设置如下代码:
Stella981 Stella981
3年前
Spring+ Spring cloud + SSO单点登录应用认证
之前的文章中有介绍springcloudsso集成的方案,也做过springjwtredis的解决方案,不同系统的无缝隙集成,统一的sso单点登录界面的管理、每个应用集成的权限认证,白名单等都是我们需要考虑的,现在针对于以上的问题我们做了sso单点登录应用认证平台,设计如下:1\.数据库设计:Java代码!复制代码(http
Wesley13 Wesley13
3年前
CAS单点登录(一):单点登录与CAS理论介绍
一、什么是单点登录(SSO)  单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。  单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所
Wesley13 Wesley13
3年前
PHP案例:实现登录功能
说明:采用PhpStorm集成开发环境和wamp套件。四个页面:登录页面、登录处理页面、成功页面、失败页面!(https://oscimg.oschina.net/oscnet/upa4a4fad9473e2c30fbc84adf7d6de41a.png)1、登录页面login.php<!DOCTYPEht
Stella981 Stella981
3年前
Django学习之JWT
JWTJsonWebToken,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC7519),被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。单点登录(SingleSignOn,以下简称SSO),是指在多系统应用群中登录一个系统,便可在该应用群其他所有系统中得到授权而无需再次登录。
LeeFJ LeeFJ
2年前
Foxnic-Web 实现单点登录(SSO)
<aname"RPMAi"</a概述所谓单点登录(SingleSignOn),简称为SSO,就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。<br/任何系统接入SSO前需要完成两个步骤,<b
GoCoding GoCoding
2年前
Casdoor 开始
Casdoor是一个基于OAuth2.0/OIDC的中心化的单点登录(SSO)身份验证平台,本文是其安装和运行的实践记录。
鸿蒙小林 鸿蒙小林
1星期前
《仿盒马》app开发技术分享-- 个人中心页or静态头像选择(业务逻辑)(22)
技术栈Appgalleryconnect开发准备上一节我们实现了登录页面的业务逻辑,并且成功的实现了数据的查询,同时我们新增了用户首选项的工具类,现在主界面往登录页面跳转,登录成功后我们关闭登录页面,这时候我们就会回到个人中心页面,那么现在我们的业务逻辑是