YII框架多子域名同步登录问题

十度 Yii 2016年01月14日 收藏

 第一步:修改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);