Рубрики
Без рубрики

Весенняя безопасность – Стойкий Запомни меня

Безопасное решение Remember Me с защитой Spring – использование токена, сохраненного в базе данных.

Автор оригинала: Eugen Paraschiv.

1. Обзор

В этой статье будет показано, как настроить функциональность Remember Me в Spring Security – используя не только стандартный подход к файлам cookie, но и более безопасное решение с использованием персистентности .

В качестве быстрого вступления – Spring можно настроить для запоминания учетных данных между сеансами браузера. Это позволяет вам войти на веб-сайт, а затем автоматически войти в систему при следующем посещении сайта (даже если вы тем временем закрыли браузер).

2. Два Решения “Запомни меня”

Spring предоставляет две немного разные реализации для решения этой проблемы. Оба используют фильтр UsernamePasswordAuthenticationFilter , используя крючки для вызова реализации RememberMeServices|/.

Мы уже рассмотрели стандартное решение Remember Me, используя только файл cookie, в предыдущей статье . Это решение использовало файл cookie под названием remember-me – содержащий имя пользователя, время истечения срока действия и хэш MD5, содержащий пароль. Поскольку он содержит хэш пароля, это решение потенциально уязвимо , если файл cookie будет захвачен.

Имея это в виду, давайте рассмотрим второй подход – использование PersistentTokenBasedRememberMeServices для хранения сохраненной информации о входе в систему в таблице базы данных между сеансами.

3. Предварительные условия – Создайте таблицу базы данных

Во – первых – нам нужно иметь информацию для входа в базу данных-нам нужно создать таблицу для хранения данных:

create table if not exists persistent_logins ( 
  username varchar_ignorecase(100) not null, 
  series varchar(64) primary key, 
  token varchar(64) not null, 
  last_used timestamp not null 
);

Это создается автоматически при запуске с помощью следующей конфигурации XML (с использованием базы данных H2 в памяти):



     

И для полноты картины, вот как настраивается настойчивость:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-h2.properties" })
public class DatabaseConfig {

    @Autowired private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));
        return dataSource;
    }
}

4. Конфигурация безопасности Spring

Первая ключевая конфигурация-это конфигурация Http Remember-Me (обратите внимание на свойство Источник данных ):


    ...
    
 

Далее – нам нужно настроить фактический RememberMeService и JdbcTokenRepository (который также использует источник данных) :



    
    
    

 

 
     
     


 
 
     
     
 

5. Файл cookie

Как мы уже упоминали, стандартный TokenBasedRememberMeServices хранил хэшированный пароль пользователя в файле cookie.

Это решение – PersistentTokenBasedRememberMeServices использует уникальный идентификатор серии для пользователя . Это определяет начальный логин пользователя и остается постоянным каждый раз, когда пользователь автоматически входит в систему во время этого постоянного сеанса. Он также содержит случайный токен , который восстанавливается каждый раз, когда пользователь входит в систему с помощью сохраненных функций remember-me.

Эта комбинация случайно сгенерированных серий и токенов сохраняется, что делает атаку грубой силы очень маловероятной.

6. На практике

Чтобы увидеть механизм запоминания меня, работающий в браузере, вы можете:

  1. Войдите в систему с помощью Remember Me active
  2. Закройте браузер
  3. Снова откройте браузер и вернитесь на ту же страницу. Освежить.
  4. Вы все равно войдете в систему

Без Remember Me active , после истечения срока действия файла cookie пользователь должен быть перенаправлен обратно на страницу входа в систему. С помощью remember me пользователь теперь остается в системе с помощью нового токена/cookie.

Вы также можете просматривать файлы cookie в браузере и сохраненные данные в базе данных (примечание – для этого вы можете переключиться со встроенной реализации H2).

7. Заключение

В этом учебном пособии показано, как настроить и настроить базу данных, сохраняющую функциональность токена Remember Me . Это также продолжение предыдущей статьи, в которой обсуждалась стандартная функциональность на основе маркеров Cookie . Подход к базе данных более безопасен, поскольку данные пароля не сохраняются в файле cookie, но он требует немного большей конфигурации.

Реализацию этого учебника Spring Security REST можно найти в проекте GitHub – это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.