Аутентификация удаленно подтвержденных учетных данных пользователя для бэкэнда TYPO3

Мне нужна небольшая помощь при входе в систему для внутреннего пользователя, чьи учетные данные были проверены удаленным сервером. Фактический пользователь и все его разрешения устанавливаются в TYPO3, но пароль хранится на удаленном сервере.

До сих пор я создал небольшое расширение, которое перенаправляет бэкэнд-логин на моего провайдера входа:

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['backend']['loginProviders'][1433416747]['provider'] = \User\MyExtension\Hooks\LoginProvider::class;

где я проверяю комбинацию имени пользователя и пароля на удаленном сервере.

class LoginProvider implements LoginProviderInterface
{
    public function render(StandaloneView $view, PageRenderer $pageRenderer, LoginController $loginController)
    {

        $view->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName('EXT:my_extension/Resources/Private/Templates/BELogin.html'));

        // Check request
        if (
            isset($_POST['login_status'])
            && $_POST['login_status'] == 'login'
            && !empty($_POST['username'])
            && !empty($_POST['p_field'])
            && $_POST['interface'] == 'backend'
        ) {
            // Get EXT connection data from settings
            $EXT_CONFIG       = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['my_extension']);
            $this->extServer = $EXT_CONFIG['extServer'];
            $this->extDC     = $EXT_CONFIG['extDC'];

            // Assign received login data
            $this->username = GeneralUtility::_GP('username');
            $this->password = GeneralUtility::_GP('p_field');

            // Try to authenticate
            if ($this->checkCredentials()) {
                // @TODO: Need to log in the verified user credentials!
            }
        }
    }

    private function checkCredentials()
    {
        // Check if local user exists
        $local = $GLOBALS['TYPO3_DB']->exec_SELECTcountRows("uid", "be_users", "username='{$this->username}' AND disable=0") ?? 0;

        // Check credentials and recieve user object if correct, or false if wrong
        if ($local > 0) {
            $ext           = new EXT($this->extServer, $this->extDC);
            $this->extUser = $ext->authorize($this->username, $this->password);
        }

        return $this->extUser ? true : false;
    }
}

Теперь мне нужно войти в систему под подтвержденным пользователем, но я не понимаю, как это сделать.

PS: я уже нашел BackendUserAuthentication, но это работает только после того, как пользователь уже аутентифицирован (или я не знаю, как его использовать).


person Peon    schedule 25.09.2017    source источник


Ответы (1)


LoginProvider предназначен только для отображения другой формы входа (например, для openID, для которого не требуется поле пароля).

Вам необходимо внедрить службу аутентификации: https://docs.typo3.org/typo3cms/Typo3ServicesReference/Authentication/Index.html

person helhum    schedule 25.09.2017
comment
Можете ли вы добавить небольшой пример того, как мне перенаправить на мою службу аутентификации? - person Peon; 25.09.2017
comment
Если вы хотите только аутентифицировать имя пользователя/пароль в другой службе аутентификации, нет необходимости в механизме перенаправления. Вы создаете службу аутентификации, и она должна выполнять внутреннюю аутентификацию против вашей службы и сообщать TYPO3 только 0/100/200. Взгляните на существующие службы аутентификации: - person kraftb; 26.09.2017
comment
typo3/sysext/rsaauth/ext_localconf.php: \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addService( - person kraftb; 26.09.2017
comment
@kraftb Хорошо, я добавил это в свою конфигурацию, и она вызывает мой AuthService при отправке, но служба в примере rsa имеет только init и processLogin. Теперь исходный класс AuthenticationService имеет метод authUser, который возвращает 200 в случае успеха, но я не могу понять, как его реализовать. Метод init вызывается при отправке, а другие нет. Я понимаю, что могу показаться глупым и, возможно, смотрю на это с неправильной точки зрения ›.‹ - person Peon; 26.09.2017