Соль Spring Security для пользовательских UserDetails - PullRequest
6 голосов
/ 28 декабря 2011

Я хотел бы добавить соль, как:

PasswordEncoder encoder = new ShaPasswordEncoder();
        userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails));

пока userDetails является экземпляром моего пользовательского класса UserDetail, я обязан привести его к этому весеннему классу: UserDetails , но, как логично ожидать, я получил во время выполнения:

java.lang.ClassCastException: model.UserDetails cannot be cast to org.springframework.security.core.userdetails.UserDetails

конфигурация:

<beans:bean id="saultSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
        <beans:property name="userPropertyToUse" value="username"/>
</beans:bean>

<authentication-manager alias="authenticationManager">
<authentication-provider>
<password-encoder hash="sha">
    <salt-source user-property="username"/>
</password-encoder>
    <jdbc-user-service data-source-ref="dataSource"/>
</authentication-provider>
</authentication-manager>

Как правильно настроить соль в этом случае?

Ответы [ 3 ]

3 голосов
/ 29 декабря 2011

ReflectionSaltSource работает только с объектом UserDetails (я предполагаю, что именно здесь вы получаете исключение приведения класса?), Поэтому вам придется либо реализовать UserDetails, либо создать собственную реализацию SaltSource, котораяработает с вашим объектом.

Однако я бы не использовал свойство пользователя в качестве соли, если вы не работаете с устаревшей системой, которая уже делает это.Имя пользователя не очень хорошее солт-значение.Гораздо лучше использовать случайную соль, которая хранится с паролем.Хорошим примером является алгоритм BCrypt.См. Мой ответ на этот вопрос для примера использования его с Spring Security 3.1.Как объяснялось здесь, BCrypt автоматически генерирует случайную соль, которую он хранит в той же строке, что и хешированный пароль.

Обратите внимание, что в Spring Security 3.1 фактически существует новый интерфейс PasswordEncoder"крипто" пакет (в org.springframework.security.crypto.password).Сюда не входит соль в API-методах , поскольку предполагается, что соль генерируется внутренне (как в реализации BCrypt).Фреймворк, как правило, принимает один из этих или устаревших org.springframework.security.authentication.encoding.PasswordEncoder.

1 голос
/ 29 декабря 2011

Ваш класс model.UserDetails должен реализовывать интерфейс org.springframework.security.core.userdetails.UserDetails - ему не обязательно должен быть класс org.springframework.security.core.userdetails.User.

Вы также можете взглянуть на этот ответ , чтобы узнать, как настроить ReflectionSaltSource для кодирования и декодирования паролей, или помочь получить более широкую картину, чтобы следовать замечательному совету Люка по BCryptPasswordEncoder.

0 голосов
/ 05 июля 2012

Я написал пост в блоге о некоторых из этих деталей здесь: http://rtimothy.tumblr.com/post/26527448708/spring-3-1-security-and-salting-passwords Люк написал код, чтобы он, конечно, знал, о чем говорит, но я вижу, что многие люди, в том числе и я, испытывают затруднения в поисках работы.эта информация, надеюсь, что вроде поможет.

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