如我所说
here
,我将允许预生成的用户使用默认的From从SilverStripe4网站前端页面注销。注销是因为登录有效。
问题是,如果登录的普通用户试图通过单击类似
Security/logout
(以及
Security/logout?BackURL=home/
,它将被重定向到一个空白页(默认情况下,只显示页眉/页脚)
Page.ss
实施)。显然,控制器不工作或类似,因为URL只指向我
安全/注销
没有以下重定向。此外,会话没有被清除,如果我返回用户仪表板页面,它的结果仍然是登录的。
所以,我尝试实现一个自定义验证器,就像我在SS3中通常做的那样,但是我注意到了一些小的差异。然后,我跟着
official doc
以及
suggested example
寻求帮助。
情况如下:
MemberAuthenticator自定义类
中
mysite/代码
)
<?php
namespace Greylab\Corporate\Authenticator\UtenteAuthenticator;
use SilverStripe\Security\MemberAuthenticator\MemberAuthenticator;
class UtenteAuthenticator extends MemberAuthenticator
{
public function getLoginHandler($link)
{
return UtenteLoginHandler::create($link, $this);
}
public function getLogoutHandler($link)
{
return UtenteLogoutHandler::create($link, $this);
}
}
memberauthenticator\loginhander自定义类
(在
mysite/代码
)
<?php
use SilverStripe\Security\MemberAuthenticator\LoginHandler;
use SilverStripe\Core\Injector\Injector;
class UtenteLoginHandler extends LoginHandler
{
public function doLogin($dati, $form)
{
$utente = $this->checkLogin($dati);
if ($utente) {
$request = Injector::inst()->get(HTTPRequest::class);
$session = $request->getSession();
$cliente = $session->set('UtenteLoginHandler.MemberID', $utente->ID);
$profiloPaziente = Member::get()->byID($session->get('UtenteLoginHandler.MemberID'));
$datiPaziente = $session->set('UtenteLoginHandler.Data', $dati);
if ($profiloCliente) {
$this->performLogin($profiloCliente, $datiCliente);
return $this->redirectAfterSuccessfulLogin();
} else {
return $this->redirectBack();
}
} else {
return $this->redirectBack();
}
}
}
memberauthenticator\logouthandler自定义类
(在
mysite/代码
)
use SilverStripe\Security\MemberAuthenticator\LogoutHandler;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Security\Security;
use SilverStripe\Security\IdentityStore;
use SilverStripe\Security\Member;
use SilverStripe\Control\HTTPResponse;
class UtenteLogoutHandler extends LogoutHandler
{
public function doLogOut($utente)
{
if ($utente) {
$request = Injector::inst()->get(HTTPRequest::class);
$session = $request->getSession();
$paziente = $session->get('UtenteLoginHandler.MemberID');
$datiPaziente = $session->get('UtenteLoginHandler.Data');
if ($paziente && $datiPaziente) {
$session->clear('UtenteLoginHandler.MemberID');
$session->clear('UtenteLoginHandler.Data');
Security::setCurrentUser(null);
return $this->redirectAfterLogout();
} else {
return $this->redirectBack();
}
}
}
成员身份验证程序注入
(在我的网站上)/
配置/mysite.yml
)
SilverStripe\Core\Injector\Injector:
SilverStripe\Security\Security:
properties:
Authenticators:
UtenteAuthenticator: %$Greylab\Corporate\Authenticator\UtenteAuthenticator
有了这个实现,一切都没有改变。
有人能给我建议正确的方法吗?
提前感谢大家。