【问题标题】:YII2 post logout link on non YII2 pageYII2 在非 YII2 页面上发布注销链接
【发布时间】:2019-11-13 16:49:30
【问题描述】:

我创建了一个 YII2 站点,我希望允许用户注销,而不是在 YII2 文件夹中的页面上。在 YII2 中我使用的是 nav 组件,所以布局的注销部分看起来像这样

echo Nav::widget([
    'options' => ['class' => 'navbar-nav navbar-right player-page'],
    'encodeLabels' => false,
    'items' => [
        [
            'label' => 'Logout',
            'items' => [
                [
                    'label' => 'Sign out (' . Yii::$app->user->identity->username . ')',
                    'url' => ['/site/logout'],
                    'template' => '<a href="{url}" data-method="post">{label}</a>',
                    'linkOptions' => ['data-method' => 'post']
                ],
            ],
        ],
    ],
]);

我已经尝试过 Javascript。这是最新的。

 window.onload=function() {
   document.getElementById("logout").onclick=function() {
     var myForm = document.createElement("form");
     myForm.action='http://151.236.49.237/~aceify1/booking/site/logout';// the href of the link
     myForm.target="myFrame";
     myForm.method="POST";
     document.body.appendChild(myForm);
     myForm.submit();
     return false; // cancel the actual link
   }
 }

但它只是在 YII2 注销 URL 上显示内部服务器错误。

任何想法都将不胜感激。

【问题讨论】:

  • 检查调试工具栏、app.log 或 apache 的 error.log 是否有实际错误可能是个好主意。
  • _csrf 令牌必须与 POST 请求一起发送。
  • 错误代码是什么?并且您想从其他网址退出网站吗?这样您的域是 domain.com 并且您想在 example.com 中使用 url 注销?
  • Michal - 我检查了 error_log 并且有一个错误,但它没有用。我猜重要的部分是这个“异常 'yii\web\BadRequestHttpException' 并带有消息'无法验证您的数据提交。'”这可能与 Manu 所说的有关。 ttrasn - 它来自同一个域,所以 yii 就像 domain.com/subsite 并且我想要有 logoug 链接的页面在根域中。我将创建一个 YII2 页面,它只有一个注销链接和 iframe/嵌入它。感谢您的意见,如果有人有任何比 iframe 更巧妙的想法,我很想听听。
  • 如果消息类似于“无法验证您的数据提交”。然后需要禁用 CSRF 验证...

标签: yii2


【解决方案1】:

您可以禁用注销功能的 CSRF 验证检查。将此添加到您的控制器,或根据需要修改您已经存在的 beforeAction()

public function beforeAction($action)
{            
    if ($action->id == 'logout') {
         $this->enableCsrfValidation = false;
    }

    return parent::beforeAction($action);
}

【讨论】:

  • 或者像logoutAction这样的action里面写$this->enableCsrfValidation = false;
  • 谢谢。最后,我做了我在之前评论中提到的内容,并创建了一个页面,其中包含链接并对其进行了 iframe,并进行了一些设计调整,效果很好。
【解决方案2】:

您只需将其转换为没有 data-method='POST'

的简单链接

并删除SiteControllerbehaviors功能的下一行

'logout' => ['post'],

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多