序言 本文主要是对“关于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如何实现真正的永久登陆,还请大牛们解答,后续要是我解决了也会继续更新,一同进步。