PHP7中文手册2018 带注释 最新chm版
SSO (Single Sign-on) 顾名思义就是几个子项目共用一个登录点. 原理简单来说就是服务端session 共享, 客户端跨域cookies.
最近一个YII2的项目正好需要实现SSO, 可是在网上搜了半天没有找到一个解决方案. 于是研究了一下源代码. 其实在Yii2只需要配置 config就能实现. 在config 头加上domain信息 $host = explode('.', $_SERVER["HTTP_HOST"]); if (count($host) > 2) { define('DOMAIN', $host[1] . '.' . $host[2]); } else { define('DOMAIN', $host[0] . '.' . $host[1]); } define('DOMAIN_HOME', 'www.' . DOMAIN); define('DOMAIN_USER_CENTER', 'man.' . DOMAIN); define('DOMAIN_API', 'api.' . DOMAIN); define('DOMAIN_EMAIL', 'mail.' . DOMAIN); define('DOMAIN_LOGIN', 'login.' . DOMAIN); define('DOMAIN_IMG', 'img.' . DOMAIN); 然后配置User 和 Session: 'user' => [ 'enableAutoLogin' => true, 'identityCookie' => ['name' => '_identity', 'httpOnly' => true, 'domain' => '.' . DOMAIN], ], 'session' => [ 'cookieParams' => ['domain' => '.' . DOMAIN, 'lifetime' => 0], 'timeout' => 3600, ], 这样单点登陆基本实现, 从login.xxx.com 登陆后, 去到www.xxx.com session 依然有效果. 另外, 我修改了 urlManager, 使之可以生成其它domain的URL. 'urlManager' => [ 'class' => 'common\components\MutilpleDomainUrlManager', 'domains' => [ 'man' => '//' . DOMAIN_USER_CENTER, 'mail' => '//' . DOMAIN_EMAIL, 'img' => '//' . DOMAIN_IMG, 'api' => '//' . DOMAIN_API, 'login' => '//' . DOMAIN_LOGIN, ], 'baseUrl' => '//' . DOMAIN_HOME, # Default BaseUrl 'showScriptName' => false, 'enablePrettyUrl' => true, ], 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 Yii::$app->urlManager->createUrl('site/index'), # www.xxx.com/site/index Yii::$app->urlManager->createUrl('login', 'site/login'), # login.xxx.com/site/login Yii::$app->urlManager->createUrl('article/list'), # login.xxx.com/article/list Yii::$app->urlManager->createUrl('man', 'user/view'), # man.xxx.com/user/view
转载请注明:谷谷点程序 » YII2 配置 跨域登录实例