【问题标题】:How to authenticate users from two Yii apps on the same server?如何在同一台服务器上验证来自两个 Yii 应用程序的用户?
【发布时间】:2014-02-11 05:27:54
【问题描述】:

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

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

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

我想要发生的事情

两个应用程序的帐户相同

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

没有发生什么

(4)。用户被重定向到 app1,但仍提示登录。

然后我查看了 app1 和 app2 中的 cookie 和会话,并在 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>',
        ),
    ),

我整周都在纠结这个问题,由于截止日期即将到来,我认为是时候寻求一些必要的帮助了!

编辑 这是我使用 CDbHttpSession 启动会话的配置文件 main.php。我现在将会话存储到名为 YiiSession 的数据库表中:

    'sessionName'=>'app',
        'class'=>'CDbHttpSession',
        'autoCreateSessionTable'=> false,
        'connectionID'=>'db',
        'sessionTableName'=>'YiiSession',
        'useTransParentSessionID' =>($_POST['PHPSESSID']) ? true: false,
        'autoStart' => 'false',
        'cookieMode' => 'only',
        'timeout'=> 300
    ),

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

【问题讨论】:

    标签: php .htaccess login yii


    【解决方案1】:

    我的第一句话是检查 cookie 是否具有良好的域,因此两个应用程序都收到了它们并使用相同的会话。看来您已经检查过了,没关系。

    现在,为了确定当前登录的用户,CWebUser 在会话中查找 [some prefix]__id 变量。该前缀可以是CWebUser-&gt;stateKeyPrefix,如果为空,则可以是基于类名和 Yii 应用程序 ID 的 MD5。

    Yii 应用程序 ID 由 CApplication-&gt;id 属性指定,或基于应用程序的基本路径生成。

    因此,最简单的方法是将相同的应用程序 ID 添加到您的两个应用程序中,然后它应该能够为两个应用程序使用相同的 cookie 并“检测登录用户”。

    只需编辑您的配置并在两个应用程序的最高级别添加一个“id”:

    return array
    (
        'id' => 'sharedApplicationId',
    
        'components' => array( ... ), 
    );
    

    这将导致Yii::app()-&gt;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__idapplication2StateKeyPrefix__id 在会话,他们不会看到彼此的登录用户。

    【讨论】:

    • 我总是阅读有关将其置于最高级别的信息。有什么理由吗?我很好奇配置。似乎您的配置位置存在层次结构,但我想知道为什么! :) 另外,“id”可以是任何东西,对吗?
    • 我还添加了您发送给我的那行代码以添加到我的配置顶部,它甚至无法运行我的应用程序。
    • 那么配置是在应用程序对象上设置的。所以如果你给它一个最高级别的“id”,它将被传递给 Yii::app()->setId() 等等。你能看看你是否能找到问题所在并提供更多信息吗?
    • 目前可以登录。我按问题更新。我现在使用 CdbHttpSessions 将我的会话存储到数据库中,但我仍然没有成功地将两个用户登录到两个应用程序中。知道为什么吗?由于两个应用程序都为 YiiSession 使用相同的数据库和表,这不应该在不使用应用程序 ID 的情况下工作吗?
    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2019-10-29
    • 2011-11-21
    • 2010-11-13
    相关资源
    最近更新 更多