Как восстановить пароль формы входа в Custom UserDetailsService - PullRequest
1 голос
/ 12 октября 2011

У меня есть класс Custom User, который расширяет класс User (Spring Security) и класс Custome UserDetailsService.Эта служба запрашивает базу данных с использованием метода службы Hibernate для получения сведений о пользователе.Если в базе данных не найдены записи для этого userId, вместо создания исключения UsernamNotFoundException я хочу создать фиктивный пользовательский объект Custom и передать аутентификацию с атрибутами только для чтения.Но я не могу заставить его работать, потому что я не уверен, как получить значение пароля, введенное пользователем на странице входа.Мне нужно передать его в пользовательский конструктор пользователя, чтобы он был аутентифицирован должным образом.

Итак, чтобы подвести итог, есть ли способ получить пароль, введенный пользователем на странице входа в метод loadUserByUserName ()?Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 13 октября 2011

Я делаю что-то в том же духе в текущем проекте. Я только начал получать Spring Security за последние 2 недели, но я действительно в это время копался (прикрепленный источник, прошел через отладчик).

У меня есть пользовательский класс, который расширяет org.springframework.security.core.userdetails.User и пользовательский класс, который реализует org.springframework.security.core.userdetails.UserDetailsService интерфейс.

Как вы знаете, подпись метода loadUserByUsername в UserDetailsService интерфейсе указывает, что класс, реализующий интерфейс UserDetails , будет возвращен.

Spring Security собирается взять класс, который реализует UserDetails и проверить имя пользователя и пароль, предоставленные формой входа / базовой аутентификацией / дайджест-аутентификацией / (независимо от выбранной схемы аутентификации), с именем пользователя и паролем в UserDetails .

Я не нашел способа получить учетные данные, предоставленные конечным пользователем, по схеме аутентификации. Если хотите, я мог бы попытаться разобраться в этом, когда завтра вернусь на работу (я дома и пишу это по памяти.

0 голосов
/ 13 октября 2011

Мы можем сделать что-то похожее на то, что вы просите, расширив AbstractUserDetailsAuthenticationProvider. Есть метод retrieveUser (String _userName, UsernamePasswordAuthenticationToken _authToken), который вы можете переопределить и добавить в свою собственную пользовательскую логику. Возвращаемый объект - UserDetails. Таким образом, на этом этапе вы можете создать свои собственные пользовательские элементы UserDetails и вернуть их обратно в платформу (примечание: вы также можете установить свои атрибуты только для чтения в этом методе).

На этом этапе Spring Security не будет пытаться аутентифицироваться с использованием пароля. Они оставляют это для дополнительного метода AuthenticationChecks (UserDetails _userDetails, UsernamePasswordAuthenticationToken _authToken), который также можно переопределить. Поскольку именно здесь вы должны выполнить проверку пароля, можно просто пропустить проверку и позволить методу вернуться. На этом этапе ваш анонимный пользователь будет проверен.

Наконец добавьте это в ваш security.xml

<authentication-manager alias="authenticationManager">
    <authentication-provider ref="appUserSecurityService" />
</authentication-manager>

Надеюсь, это поможет!

0 голосов
/ 13 октября 2011

Я использую Spring 3.0.6 RELEASE и Spring Security 3.0.6 RELEASE.

Я запустил код в моем отладчике.Вы не сможете получить доступ к объекту аутентификации из пользовательского UserDetailsService .

Однако я полагаю, что вы можете создать свой собственный AuthenticationProvider, который его получит: http://static.springsource.org/spring-security/site/docs/3.0.x/reference/core-services.html

Пожалуйста, обратитесь к этому фрагменту кода из org.springframework.security Spring Security.authentication.ProviderManager , который зацикливается на AuthenticationProvider (ах):

    for (AuthenticationProvider provider : getProviders()) {
        if (!provider.supports(toTest)) {
            continue;
        }

        logger.debug("Authentication attempt using " + provider.getClass().getName());

        try {
            result = provider.authenticate(authentication);

            if (result != null) {
                copyDetails(authentication, result);
                break;
            }
        } catch (AccountStatusException e) {
            // SEC-546: Avoid polling additional providers if auth failure is due to invalid account status
            eventPublisher.publishAuthenticationFailure(e, authentication);
            throw e;
        } catch (AuthenticationException e) {
            lastException = e;
        }
    }

Как вы можете видеть, он зацикливается на каждом AuthenticationProvider и передает учетные данные.Надеюсь, это поможет!

Филипп

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