Пользовательская аутентификация и кодирование паролей Spring Security

Есть ли учебное пособие или есть ли у кого-нибудь указатели, как сделать следующее с помощью Spring-Security?

Задача :

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

дополнительная информация:

Я использую нестандартную структуру базы данных. Объект UserDetails создается с помощью настраиваемой службы UserDetailsService , которая, в свою очередь, использует настраиваемый DAOProvider для получения информации из базы данных.

мой файл security.xml на данный момент:


    
    

теперь, думаю, мне понадобится

        

, но что еще? Как сообщить Spring Security использовать соль, предоставленную базой данных, для кодирования пароля?


изменить :

Я обнаружил Этот пост SO информативен, но недостаточен: если я определю источник соли в моем xml, который будет использоваться кодировщиком пароля, например:

                        
            
        

Мне придется написать собственный SaltSource, чтобы использовать свою собственную соль. Но этого нельзя найти внутри объекта UserDetails . Итак ...

Альтернатива 1:

Могу ли я использовать настраиваемую реализацию UserDetails, которая может иметь свойство соли?


и

@Service("userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService {
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {

        // ...
        return buildUserFromAccount(account);
    }

    @Transactional(readOnly = true)

    UserDetailsImpl buildUserFromAccount(Account account){

        // ... build User object that contains salt property
}

настраиваемый класс пользователя:

public class UserDetailsImpl extends User{

    // ...

    private String salt;

    public String getSalt() { return salt; }

    public void setSalt(String salt) { this.salt = salt; }
}

безопасность.xml:


    
                        
        
    
    




Альтернатива 2:

В противном случае мне пришлось бы внедрить свой accountDAO в SaltSource , чтобы извлечь соль для данного userName из базы данных.

НО: Как Spring Security вызывает SaltSource ? Всегда с saltSource.getSalt (userDetails) ?

Тогда мне просто нужно было убедиться, что мой SaltSource использует userDetails.accountName в моем accountDAO для получения соли.


Edit2:

Только что узнал, что мой подход ... унаследованный .. :( Так что, я думаю, я просто буду использовать StandardPasswordEncoder (который мне еще предстоит выяснить, как именно использовать) .

Кстати: я реализовал первый вариант с помощью настраиваемого класса UserDetails, расширяющего класс User и просто добавляя свойство соли, которое затем передается в SaltSource как userPropertyToUse, как это было предложено в сообщении SO, упомянутом в Edit 1 ...


РЕДАКТИРОВАТЬ 3:

Только что заработал StandardPasswordEncoder, поэтому я оставлю здесь несколько указателей:

Используйте StandardPasswordEncoder для аутентификации:






    
                 
    

Для этого требуется модуль spring -security-crypto в версия 3.1.0.RC? Насколько мне известно. Не удалось найти ни одного репозитория с версией 3.0. (хотя где-то там были перечисленные версии, включая 3.0.6 и т. д.). Также в документации говорится о Spring security 3.1, поэтому я решил, что я просто воспользуюсь этим.

При создании пользователя (для меня это может делать только администратор), я st используйте

        StandardPasswordEncoder encoder = new StandardPasswordEncoder();
        String result = encoder.encode(password);

и все готово.

Spring безопасность случайным образом создаст соль и добавит ее в строку пароля перед сохранением в базе данных, поэтому столбец соли больше не нужен .

Однако можно также предоставить глобальную соль в качестве аргумента конструктора ( new StandardPasswordEncoder ("12345"); ), но я не знал, как настроить мою конфигурацию безопасности для получения этого значения из bean-компонент вместо предоставления статической строки с . Но я все равно не знаю, сколько это нужно.

52
задан Community 23 May 2017 в 02:33
поделиться