第一步:修改php.ini配置文件,把cookie_domain=改成“cookie_domain=meylou.com”
第二部:修改各个站点的config 文件:components节点->user节点->加上'stateKeyPrefix'=>'你的前缀',最后大概是这样的:
'components'=>array( 'user' => array( 'allowAutoLogin' => true, 'stateKeyPrefix'=>'yourfix', ), )
第三部: 修改各个站点的config 文件:components节点加上statePersister节点,最后大概是这样的:
'components'=>array( 'statePersister'=>array( 'class'=>'system.base.CStatePersister', 'stateFile'=>'/protected/runtime/state.bin', ), ),
OK了。解释下:
第一步,确保PHPSESSIDn能在各个二级域名下通用。这样SESSION就能共享了!
第二部,确保每个站点验证登录信息的时候用同样的前缀。
第三部,YII验证有一个state.bin保存了HASH,他要读取这个,把state.bin共用就好了!
业务需求:使用yii framework开发了多个站点,或者只是使用yii framework的不同module配置成不同的子域名(例如本站),只需要在统一登录页面登录,其他所有站点均登录。以下配置文件在config.php中,所有需要同步的站点都需要填写,本站只有一个配置文件,但会根据不同域名加载不同的路由规则。网上一些站点给出的解决方法总体是对的,但仍有细节没说清楚,导致走了些弯路,经过测试后,确定以下方案是可行的。
'components'=>array( 'user'=>array( //'class'=>'CWebUser',//你可以自定义你的Cwebuser 'identityCookie'=>array('domain' => '.newsoul.cn','path' => '/'),//配置用户cookie作用域 // enable cookie-based authentication 'allowAutoLogin'=>true,//允许同步登录 'stateKeyPrefix'=>'newsoul',//你的前缀,必须指定为一样的 'loginUrl'=>array('/site/login'), ), 'session' => array( 'cookieParams' => array('domain' => '.newsoul.cn', 'lifetime' => 0),//配置会话ID作用域 生命期和超时 'timeout' => 3600, ), 'statePersister'=>array( //指定cookie加密的状态文件 'class'=>'CStatePersister',//指定类 'stateFile'=>'../CommonLib/protected/runtime/state.bin',//配置通用状态文件路径,注意,如果你的站点是分布式的,你必须把该文件复制一份到不同服务器上,否则无法跨域。因为里面有个通用密钥,密钥不同则无法验证身份。 ),
配置到这里就结束了,但是仍有一点,请确保你的登录使用了cookie,至少本站是这样解决的:
Yii::app()->user->login($this->_identity,2592000);