如何在同一台服务器上对两个Yii应用程序的用户进行身份验证?

时间:2014-02-11 05:27:54

标签: php .htaccess login yii

我在过去就单点登录(SSO)问了一个类似的问题,但我意识到这只适用于子域名,但在我的情况下,我不是使用子域名,而是使用不同的Yii应用程序一个域下的服务器。

我有www.mydomain.com/app1和www.mydomain.com/app2

两个应用程序都使用相同的数据库并使用相同的表进行登录。

我想要发生什么

两个应用程序的帐户相同

  1. 用户登录app2(或app1。没关系)
  2. 用户已登录并定向到主页。
  3. 用户点击菜单中的链接,将其重定向到app2(如果来自app2,则为app1)
  4. 用户被重定向到app2并跳过登录,因为他们已经登录并被重定向到帐户的主页。
  5. 用户点击菜单中的注销链接。
  6. 用户已从两个应用程序注销。
  7. 未发生的事情

    (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
        ),
    

    现在登录工作,会话正在存储到数据库中,但它仍然没有登录到两个应用程序。两个应用程序都具有相同的配置。

1 个答案:

答案 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,他们不会看到彼此登录的用户。