SilverStripe 4 - пустая страница при выходе - PullRequest
0 голосов
/ 21 мая 2018

Как я уже сказал здесь , я бы позволил предварительно сгенерированным пользователям выходить из веб-страницы SilverStripe 4, используя значение по умолчанию from.Выход из системы, поскольку вход в систему работает.

Проблема заключается в том, что если зарегистрированный универсальный пользователь пытается выйти из системы, щелкнув ссылку, например Security/logout (а также Security/logout?BackURL=home/), он перенаправляется на пустое место.страница (только с видимым верхним / нижним колонтитулом, так как по умолчанию Page.ss реализовано).Видимо, контроллер не работает или похожий, потому что URL указывает мне просто на Security/logout без следующих перенаправлений.Кроме того, сеанс не очищается, и если я вернусь на страницу панели пользователя, он все равно будет авторизован.

Итак, я попытался реализовать собственный аутентификатор, как я это обычно делаю в SS 3, ноЯ заметил некоторые небольшие различия.Затем я последовал как за официальным документом , так и за предложенным примером для получения помощи.

Это ситуация:

Пользовательский класс MemberAuthenticatorMySite / код )

<?php
// Definizione Namespace
namespace Greylab\Corporate\Authenticator\UtenteAuthenticator;
use SilverStripe\Security\MemberAuthenticator\MemberAuthenticator;

/**
* Classe Autenticazione Utente
*/
class UtenteAuthenticator extends MemberAuthenticator
{
/**
 * Login Paziente - Getter
 * @param string $link URL di autenteicazione utente
 * @return object Form di autenticazione utente
 */
public function getLoginHandler($link)
{
    return UtenteLoginHandler::create($link, $this);
}

/**
 * Logout Paziente - Getter
 * @param string $link URL di deautenteicazione utente
 * @return object Form di deautenteicazione utente
 */
public function getLogoutHandler($link)
{
    return UtenteLogoutHandler::create($link, $this);
}
}

MemberAuthenticator \ LoginHandler пользовательский класс MySite / код )

<?php
// Definizione Namespace
use SilverStripe\Security\MemberAuthenticator\LoginHandler;

use SilverStripe\Core\Injector\Injector;

/**
 * Clesse Login Utente
 */
class UtenteLoginHandler extends LoginHandler
{
    /**
     * Metodo gestione Login Utente
     * Setter
     * @param array $dati Dati form login
     * @param object $form Form login
     * @return void
     */
    public function doLogin($dati, $form)
    {
        $utente = $this->checkLogin($dati);

        // Controllo Utente
        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);

            // Controllo Utente
        if ($profiloCliente) {
            $this->performLogin($profiloCliente, $datiCliente);

            return $this->redirectAfterSuccessfulLogin();
        } else {
            // Se utente invalido torna al form
            return $this->redirectBack();
        }
        } else {
            // Se utente invalido torna al form
            return $this->redirectBack();
        }
    }
}

Пользовательский класс MemberAuthenticator \ LogoutHandler MySite / код )

// Definizione Namespace
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;

/**
 * Clesse Login Utente
 */
class UtenteLogoutHandler extends LogoutHandler
{
    /**
     * Metodo gestione Logout Utente
     * Setter
     * @param array $dati Dati form login
     * @param object $form Form login
     * @return HTTPResponse
     */
    public function doLogOut($utente)
    {
        // Controllo Utente
        if ($utente) {
            $request = Injector::inst()->get(HTTPRequest::class);
        $session = $request->getSession();
        $paziente = $session->get('UtenteLoginHandler.MemberID');
        $datiPaziente = $session->get('UtenteLoginHandler.Data');

        // Controllo Sessione Utente
        if ($paziente && $datiPaziente) {
            $session->clear('UtenteLoginHandler.MemberID');
            $session->clear('UtenteLoginHandler.Data');

            Security::setCurrentUser(null);

            return $this->redirectAfterLogout();
            // Tried with this approach too without success...
            /* if ($utente instanceof Member) {
            Injector::inst()->get(IdentityStore::class)->logOut($this->getRequest());
                return $this->redirectAfterLogout();
            } */
        } else {
            // Se sessione utente invalida torna al form
            return $this->redirectBack();
        }
    }
}

Ввод MemberAuthenticator (в _MySite / config / mysite.yml )

SilverStripe\Core\Injector\Injector:
  SilverStripe\Security\Security:
    properties:
      Authenticators:
        UtenteAuthenticator: %$Greylab\Corporate\Authenticator\UtenteAuthenticator

В этой реализации ничего не изменилось.

Кто-нибудь может подсказать мне правильный путь?

Спасибо всемзаранее.

1 Ответ

0 голосов
/ 20 августа 2018

После глубокого исследования решение пришло от храброго официального члена Slack Community: особая благодарность @ kinglozzer за него.

Проще говоря, SS 4 предоставляет совершенно новый $LogoutURL стандарт по умолчанию.Параметр для получения правильного выхода из системы URL.В него входит зарегистрированный член SecurityID в качестве параметра.Старый SS 3 Security/logout больше не достаточно для запуска процесса.Таким образом, используя:

{$LogoutURL}&BackURL=<url>

Пользователь будет выведен из системы и перенаправлен правильно.

Спасибо всем за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...