我在过去就单点登录(SSO)问了一个类似的问题,但我意识到这只适用于子域名,但在我的情况下,我不是使用子域名,而是使用不同的Yii应用程序一个域下的服务器。
我有www.mydomain.com/app1和www.mydomain.com/app2
两个应用程序都使用相同的数据库并使用相同的表进行登录。
我想要发生什么:
两个应用程序的帐户相同
未发生的事情
(4)。用户被重定向到app1但仍然会提示您登录。</ p>
然后我检查了app1&amp;中的cookie和会话。 app2和我为config文件夹中的main.php执行了以下操作:
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
'class'=>'WebUser',
),
'session'=> array(
'timeout'=> 1440
),
'partyroles'=>array(
// enable cookie-based authentication
'class'=>'WebUser',
),
// uncomment the following to enable URLs in path-format
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
整个星期我一直坚持这一点,因为截止日期即将来临,我认为现在是时候得到一些必要的帮助了!
修改 这是我的配置文件main.php使用CDbHttpSession启动会话。我现在将会话存储到名为YiiSession的数据库表中:
'sessionName'=>'app',
'class'=>'CDbHttpSession',
'autoCreateSessionTable'=> false,
'connectionID'=>'db',
'sessionTableName'=>'YiiSession',
'useTransParentSessionID' =>($_POST['PHPSESSID']) ? true: false,
'autoStart' => 'false',
'cookieMode' => 'only',
'timeout'=> 300
),
现在登录工作,会话正在存储到数据库中,但它仍然没有登录到两个应用程序。两个应用程序都具有相同的配置。
答案 0 :(得分:2)
我的第一个评论是检查cookie是否具有良好的域,从而两个应用程序都收到它们并使用相同的会话。看来你已经检查了那个,那没关系。
现在,要确定当前登录的用户,CWebUser会在会话中查找[some prefix] __ id变量。该前缀可以是CWebUser->stateKeyPrefix
,如果为空,则可以是基于类名和Yii应用程序ID的MD5。
Yii应用程序ID由CApplication->id
属性指定,或者根据应用程序的基本路径生成。
因此,最简单的方法是将相同的应用程序ID添加到您的应用程序中,然后它应该能够在两个应用程序中使用相同的cookie并“检测登录的用户”。
只需编辑您的配置,并为您的两个应用程序添加最高级别的“id”:
return array
(
'id' => 'sharedApplicationId',
'components' => array( ... ),
);
这将导致Yii::app()->id
返回相同的ID,这将使CWebUser::getStateKeyPrefix()
生成相同的前缀和presto,两个应用程序都将在会话中找到__id变量。
或者,您可以通过配置
配置CWebUser
的状态键前缀
return array
(
...
'components' => array
(
'user' => array
(
'stateKeyPrefix' => 'some_shared_prefix',
...
),
),
);
这只会影响CWebUser类。然后,它将查找像“some_shared_prefix__id”这样的会话变量来确定登录用户而不使用应用程序ID。无论哪种方式都应该有效。
所以基本上,即使您正在共享数据库(和会话),如果前缀CWebUser
最终使用因“配置错误”而不同,您只需要application1StateKeyPrefix__id
和在会话中application2StateKeyPrefix__id
,他们不会看到彼此登录的用户。