代码之家  ›  专栏  ›  技术社区  ›  Luca Cattide

SilverStripe4-注销空白页

  •  1
  • Luca Cattide  · 技术社区  · 7 年前

    如我所说 here ,我将允许预生成的用户使用默认的From从SilverStripe4网站前端页面注销。注销是因为登录有效。

    问题是,如果登录的普通用户试图通过单击类似 Security/logout (以及 Security/logout?BackURL=home/ ,它将被重定向到一个空白页(默认情况下,只显示页眉/页脚) Page.ss 实施)。显然,控制器不工作或类似,因为URL只指向我 安全/注销 没有以下重定向。此外,会话没有被清除,如果我返回用户仪表板页面,它的结果仍然是登录的。

    所以,我尝试实现一个自定义验证器,就像我在SS3中通常做的那样,但是我注意到了一些小的差异。然后,我跟着 official doc 以及 suggested example 寻求帮助。

    情况如下:

    MemberAuthenticator自定义类 mysite/代码 )

    <?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\loginhander自定义类 (在 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();
            }
        }
    }
    

    成员身份验证程序注入 (在我的网站上)/ 配置/mysite.yml )

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

    有了这个实现,一切都没有改变。

    有人能给我建议正确的方法吗?

    提前感谢大家。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Luca Cattide    6 年前

    经过深入研究,解决办法来自一位勇敢的官员,懒散的社区成员:特别感谢@ kinglozzer 为了它。

    简单地说,SS4提供了一个全新的 $LogoutURL 获取正确注销URL的默认参数。它包括已登录的成员 SecurityID 作为参数。旧党卫军3 Security/logout 不足以运行该进程。因此,通过使用:

    {$LogoutURL}&BackURL=<url>

    用户将正确注销和重定向。

    谢谢任何人的帮助。