6

受限页面、登录和重定向是否有任何实际的最佳实践?

我找到了很多示例,但都是针对较旧的 TYPO3 / felogin /.... 版本(没有站点配置)

我有以下情况:

我有几个受限页面和一个登录页面(felogin)

我希望能够深度链接(例如,通过邮件发送)到受限页面 - 如果用户未登录,则应显示登录表单 - 成功登录/注册后,应显示深度链接页面。

我使用 TYPO3 9.5 并在站点配置中添加了 403 处理来显示我的登录页面的内容。

此步骤工作正常 - 显示登录页面。

我在 felogin 插件中配置了引荐来源网址和 GET/POST 重定向,但这些都不起作用。

有没有人有一个例子,我可以在成功登录/注册后重定向到原来的调用(受限)页面?

谢谢

基督教

4

3 回答 3

5

对于 GET/POST 重定向,您需要 URL-parameter &return_url=。也许您可以尝试重写 40​​3 处理程序中的 GET 参数以包含它。那可能是黄金。

我就是这样做的:(登录页面有uid=81

  • 站点配置:(显示登录页面的内容)
    errorHandling:
      - errorCode: '403'
        errorHandler: Page
        errorContentSource: 't3://page?uid=81'
    ...
    
  • 排版:
    config {
      typolinkLinkAccessRestrictedPages = 81
      typolinkLinkAccessRestrictedPages_addParams = &return_url=###RETURN_URL###&pageId=###PAGE_ID###
    }
    # all plugin configuration via TypoScript. plugin settings in the backend unchanged.
    plugin.tx_felogin_pi1 {
      redirectMode = getpost,login
      redirectFirstMethod = 1
      linkConfig.parameter = 81
      redirectPageLogin = 96
      ...
    }
    
  • 注销链接:<f:link.page pageUid="81" title="Logout" additionalParams="{logintype: 'logout'}">...</f:link.page>

优点:

  • 使用typolink时适用于所有页面(所以所有默认菜单,链接,......)
  • 您可以通过电子邮件等共享 URL。

缺点:

  • 直接访问访问受限页面时,您会看到登录页面。然而,在登录后,您将被重定向到配置的“redirectPageLogin”页面 (96)。但是,如果我省略了该配置,则根本不会有重定向,因此用户将停留在登录页面上。

所以我不是100%满意。让我们在这里收集最佳实践示例。欢迎反馈。

于 2020-07-27T21:52:49.297 回答
3

在 Slack 频道的帮助下,我最终得到了一个解决方案,可以重定向到用户请求的任何访问受限页面:

它适用于 TYPO3 v9+

在站点配置 ( config.yaml) 中:

errorHandling:
  -
    errorCode: '403'
    errorHandler: PHP
    errorPhpClassFQCN: Vendor\ExtName\Error\ErrorHandling

setup.typoscript扩展名中felogin

config.typolinkLinkAccessRestrictedPages = {$plugin.tx_extname.settings.loginPid}
config.typolinkLinkAccessRestrictedPages_addParams = &return_url=###RETURN_URL###

// Redirect after login on Login page to previous page
plugin.tx_felogin_pi1 {
  showLogoutFormAfterLogin = 0
  redirectMode = getpost,referer
  redirectFirstMethod = 1
}

在我的扩展中(这里命名为 `Vendor\ExtName`):
<?php

namespace Vendor\ExtName\Error;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Core\Context\Context;
use TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface;
use TYPO3\CMS\Core\Http\RedirectResponse;
use TYPO3\CMS\Core\Utility\GeneralUtility;

class ErrorHandling implements PageErrorHandlerInterface
{

    /**
     * @param ServerRequestInterface $request
     * @param string $message
     * @param array $reasons
     * @return ResponseInterface
     */
    public function handlePageError(
        ServerRequestInterface $request,
        string $message,
        array $reasons = []
    ): ResponseInterface {

        //check whether user is logged in
        $context = GeneralUtility::makeInstance(Context::class);
        if($context->getPropertyFromAspect('frontend.user', 'isLoggedIn')){
            //show page with info that the access restricted page can't be visited because of missing access rights
            return new RedirectResponse('/zugang-verweigert');
        }
        return new RedirectResponse('/login?return_url=' . $request->getUri()->getPath(), 403);
    }

}
于 2020-09-22T11:12:11.763 回答
0

我没有向应受保护的页面添加用户组访问权限。而不是这个,我在受保护页面的根目录中添加了一个模板,其中包含:

[page["uid"] != 2 && usergroup(1) == false]
    page.config >
    page.config.additionalHeaders.10 {
        header = Location: https://myurl.tld/login
    }
[end]

在没有用户组 1 的有效 FE 用户会话的情况下对受保护页面的所有直接访问都将被重定向到登录页面(UID = 2)。

这意味着一个页面树分支包含所有受保护的页面。并且page在模板中当然必须是包含 PAGE 对象的数组......

这适用于 TYPO3 V9.5。

于 2020-10-04T19:35:59.647 回答