对于受限页面、登录和重定向,有什么实际的最佳实践吗?
我发现了很多例子,但都是针对旧的TYPO3/felogin/。。。。版本(无站点配置(
我有以下场景:
我有几个限制页面和一个登录页面(felogin(
我希望能够深度链接(例如,按邮件发送(到受限页面-如果用户未登录,则应显示登录表单-成功登录/注册后,应显示深度链接页面。
我使用TYPO3 9.5,在站点配置中,我添加了403处理来显示登录页面的内容。
此步骤运行良好-显示登录页面。
我在felogin插件中配置了referrer和GET/POST重定向,但这些都不起作用。
有人举过一个例子吗?在成功登录/注册后,我可以重定向到原始的被叫(受限(页面?
谢谢
基督教
对于GET/POST重定向,您需要URL参数&return_url=
。也许您可以尝试在403处理程序中重写GET params以包含它。那可能是金子。
我是这样做的:(登录页面有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>
优点:
- 适用于所有使用打字链接的页面(因此所有默认菜单、链接…(
- 您可以通过电子邮件等共享URL
缺点:
- 当直接访问访问受限页面时,您将看到登录页面。然而,登录后,您将被重定向到配置的";重定向页面登录";第(96(页。但是,如果我省略了该配置,则根本不会重定向,因此用户将停留在登录页面上
所以我不是100%满意。让我们在这里收集最佳实践示例。欢迎反馈。
在Slack频道的帮助下,我最终找到了一个解决方案,可以将重定向到用户请求的访问受限页面:
适用于TYPO3 v9+
在站点配置(config.yaml
(中:
errorHandling:
-
errorCode: '403'
errorHandler: PHP
errorPhpClassFQCN: VendorExtNameErrorErrorHandling
在扩展felogin
的setup.typoscript
中:
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 VendorExtNameError;
use PsrHttpMessageResponseInterface;
use PsrHttpMessageServerRequestInterface;
use TYPO3CMSCoreContextContext;
use TYPO3CMSCoreErrorPageErrorHandlerPageErrorHandlerInterface;
use TYPO3CMSCoreHttpRedirectResponse;
use TYPO3CMSCoreUtilityGeneralUtility;
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);
}
}
我没有向应该保护的页面添加用户组访问权限。相反,我在受保护页面的根目录中添加了一个模板,其中包含:
[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。