热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

周全剖析Yii2跨域的SSO登录逻辑

简述本文章是我对Yii2怎样完成SSO登录做一个周全的逻辑剖析。事实上,在此之前我也写过两篇文章关于SSO登录的完成体式格局以及进一步优化,包含这篇文章也都是引见Yii2的SSO登

简述

本文章是我对Yii2怎样完成SSO登录做一个周全的逻辑剖析。事实上,在此之前我也写过两篇文章关于SSO登录的完成体式格局以及进一步优化,包含这篇文章也都是引见Yii2的SSO登录,逐渐优化不停总结与分享,目标就是要把Yii2的SSO登录功用尽量的做到极致,从顺序开辟的灵活性角度去思考问题,把统统潜伏的范围抹杀在摇篮中。

完成步骤

1、在common\config\main.php文件设置以下:

use kartik\mpdf\Pdf;
//动态猎取无www的域名
$host_array = explode('.', $_SERVER["HTTP_HOST"]);
if (count($host_array) == 3) {
if(strpos($_SERVER["HTTP_HOST"],':')){ //推断域名是不是存在端口号
$domain_array=explode(':', $host_array[2]);
define('DOMAIN', $host_array[1] . '.' . $domain_array[0]);//去掉端口号,防止域名带端口号没法退出
}else{
define('DOMAIN', $host_array[1] . '.' . $host_array[2]);
}
}
//针对com.cn域名
elseif (count($host_array) == 4) {
if(strpos($_SERVER["HTTP_HOST"],':')){
$domain_array=explode(':', $host_array[3]);
define('DOMAIN', $host_array[1] . '.' . $host_array[2]. '.' . $domain_array[0]);
}else{
define('DOMAIN', $host_array[1] . '.' . $host_array[2]. '.' . $host_array[3]);
}
}else{
//echo "本系统不支持当地接见,请设置域名";exit;
}
//将动态猎取到的无www域名,设置上www、crm...
define('DOMAIN_HOME', 'www.' . DOMAIN);
define('DOMAIN_CRM', 'crm.' . DOMAIN);
define('DOMAIN_HR', 'hr.' . DOMAIN);
define('DOMAIN_WEIXIN', 'weixin.' . DOMAIN);
define('DOMAIN_ADMIN', 'admin.' . DOMAIN);
define('DOMAIN_OA', 'oa.' . DOMAIN);
define('DOMAIN_FRONTEND', 'frontend.' . DOMAIN);
define('DOMAIN_BACKEND', 'backend.' . DOMAIN);
define('DOMAIN_API', 'api.' . DOMAIN);
define('DOMAIN_LOGIN', 'login.' . DOMAIN);
设置User 和 Session:
'components' => [
'user' => [
'identityClass' => 'login\models\User',
'enableAutoLogin' => true,
'identityCOOKIE' => ['name' => '_identity', 'httpOnly' => true,'domain' => '.' . DOMAIN],
// 'returnUrl'=>'//' . DOMAIN_HOME,
],
'session' => [
'COOKIEParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0],
'timeout' => 24*3600*30,
],

2、新建一个login模块,然后翻开common\config\bootstrap.php加下这么一段代码:

Yii::setAlias('login', dirname(dirname(__DIR__)) . '/login'); //增添自定义目次构造

3、在login\config\main.php里修正 urlManager,改成下面这模样:


'urlManager' => [
'class' => 'common\components\MutilpleDomainUrlManager',
'domains' => [
'crm' => '//' . DOMAIN_CRM,
'admin' => '//' . DOMAIN_ADMIN,
'hr' => '//' . DOMAIN_HR,
'oa' => '//' . DOMAIN_OA,
'frontend' => '//' . DOMAIN_FRONTEND,
'backend' => '//' . DOMAIN_BACKEND,
// 'img' => '//' . DOMAIN_IMG,
'api' => '//' . DOMAIN_API,
'login' => '//' . DOMAIN_LOGIN,
],
//'baseUrl' => 'http://'.DOMAIN_LOGIN.'?redirectURL=http://'.DOMAIN_HOME,
'showScriptName' => false,
'enablePrettyUrl' => true, //美化URL
'enableStrictParsing' => true, //设置有没有‘s’;
// 'suffix' => ".php",
'rules' => [ '' => 'site/login',
// 假如没有这里,则接见域名不能直接翻开默许Action (去除URL的“site/login”)
]
],

4、补充第3步骤缺乏的MutilpleDomainUrlManager.php文件
MutilpleDomainUrlManager.php,这个文件根据我给你们的定名空间寄存。

namespace common\components;
use Yii;
class MutilpleDomainUrlManager extends \yii\web\UrlManager
{
public $domains = array();
public function createUrl($domain, $params = array()) {
if (func_num_args() === 1) {
$params = $domain;
$domain = false;
}
$bak = $this->getBaseUrl();
if ($domain) {
if (!isset($this->domains[$domain])) {
throw new \yii\base\InvalidConfigException('Please configure UrlManager of domain "' . $domain . '".');
}
$this->setBaseUrl($this->domains[$domain]);
}
$url = parent::createUrl($params);
$this->setBaseUrl($bak);
return $url;
}
}

解释:用于猎取domain url。

5、修正login模块下的SiteController.php Login要领

//登录
public function actionLogin()
{
//猎取当前的URL
$URL=Yii::$app->request->getHostInfo().Yii::$app->request->url;
$URL1='http://'.DOMAIN_CRM;
$redirectURL=Yii::$app->request->get('redirectURL');
$redirectURL1='http://'.DOMAIN_LOGIN;
$model = new LoginForm();
TagDependency::invalidate(Yii::$app->cache, ['Session:'.Yii::$app->session->id]);
//考证是不是已登录,非为登录
if (!\Yii::$app->user->isGuest) {
if(!empty($redirectURL)){
$this->actionLogout();//强制性退出登录

return $this->redirect($URL);
}else{
//redirectURL不存在时,提交表单推断
if($this->siteLogin){
if ($model->load(Yii::$app->request->post()) && $model->login()) {
//推断该账号是不是制止登录
if(empty($t_status=$model->user->attributes['t_status']) && $t_status==0){
return $this->error($redirectURL1,[Yii::t('yii','The account is prohibited from logging in, please contact the administrator!')]);
}else{
if(empty($redirectURL)) return $this->redirect($URL1,301);
return $this->redirect($redirectURL,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($t_status=$model->user->attributes['t_status']) && $t_status==0){
if(empty($redirectURL)){
return $this->error($redirectURL1,[Yii::t('yii','The account is prohibited from logging in, please contact the administrator!')]);
}
return $this->error($URL,[Yii::t('yii','The account is prohibited from logging in, please contact the administrator!')]);
}else{
if(empty($redirectURL)) return $this->redirect($URL1,301);

return $this->redirect($redirectURL,301);
}
} else {
return $this->renderPartial('login', [
'model' => $model,
]);
}
}
}

6、修正frontend模块下的SiteController.php Login要领

public function actionLogin()
{
//猎取上一个URL
$URL=Yii::$app->request->getHostInfo().Yii::$app->user->getReturnUrl();
if (!\Yii::$app->user->isGuest) {
return $this->redirect('http://'.DOMAIN_LOGIN.'?redirectURL='.$URL);
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
if(!empty($URL)){
return $this->redirect('http://'.DOMAIN_LOGIN.'?redirectURL='.$URL);
}else{
return $this->renderPartial('login', [
'model' => $model,
]);
}
}
}

7、在frontendviewsdefaultlayoutsmain.php的顶部到场下面代码

$redirectURL='http://'.DOMAIN_LOGIN.'?redirectURL='.Yii::$app->request->getHostInfo().Yii::$app->request->url;

8、末了在退出的a标签这么输出

注:在别的模块如:backend、crm等等当中仿制我这frontend的完成思绪改改,即可完成全部项目标SSO登录机制。

提示注重

1、在第1步骤中,动态猎取无www的域名,此步骤必需做域名的推断处置惩罚,比方:www.xxx.com,www.xxx.com.cn,www.xxx.com:8099等这些能够涌现的域名,以保证域名都能运用完成登录退出的机制。
2、在第5步骤和第7步骤中,运用Yii2自带的要领Yii::$app->request->getHostInfo().Yii::$app->request->url猎取当前的url,是比较轻易且高效的一种做法,能下降代码的冗余。
3、在第6步骤中的frontend模块下的SiteController.php Login要领里,用Yii2自带的要领Yii::$app->request->getHostInfo().Yii::$app->user->getReturnUrl()猎取上一个url,这里必需特别注重是猎取“上一个url”而不是当前的url,猎取当前的url就变成了login.xxx.com了,这是不对的。

相干材料

Yii: 猎取URL的一些要领:http://blog.csdn.net/iefreer/…


推荐阅读
  • 如何查看javaJDK中底层源码在初次使用java时,往往我们对最基本的java类会忽略对其内部基本的实现的了解,也往往不屑于了解其内部实现机制,以为它们本来就是这样子。而其实贯穿 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • AssetbundlegenerateemptyJavaScriptandCSSfiles资产包生成空的JavaScript和CSS文件namespacefrontend\ass ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 点击上方“新机器视觉”,选择加”星标”或“置顶”重磅干货,第一时间送达很早就想总结一下前段时间学习HALCON的心得,但由于其他的事情总是抽不出时间。去年有过一段时间的集中学习,做 ... [详细]
  • 目前正在做毕业设计,一个关于校园服务的app,我会抽取已完成的相关代码写到文章里。一是为了造福这个曾经帮助过我的社区,二是写文章的同时更能巩固相关知识的记忆。一、前言在爬取教务系统 ... [详细]
  • 业务:Payments&Risk大数据/AI/数据可视化时间要求:至少实习6个月,每周5天,入职时间4-5月 ... [详细]
  • CVE201916759漏洞在野利用
    CVE201916759漏洞在野利用 ... [详细]
author-avatar
扩散平衡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有