Spring Security - Постоянный Запомнить меня

Spring Security - Постоянно Запомнить меня

1. обзор

В этой статье будет показано, как настроитьRemember Me functionality in Spring Security - используя не стандартный подход только для файлов cookie, аa more secure solution, using persistence.

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

2. Два решения «Помни меня»

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

Мы уже рассмотрели стандартное решение «Запомнить меня», используя только файл cookie, вa previous article. В этом решении использовался файл cookie с именемremember-me, содержащий имя пользователя, время истечения срока действия и хеш MD5, содержащий пароль. Поскольку он содержит хэш пароля,this solution is potentially vulnerable, если файл 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
);

Этоcreated automatically on startup через следующую конфигурацию 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;
    }
}

[.iframe-fluid] ##

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

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


    ...
    

Далее - нам нужно настроить фактическиеRememberMeService иJdbcTokenRepository (которые также используютdataSource):



    
    
    




    
    




    
    

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

Это решение -PersistentTokenBasedRememberMeServices используетunique series identifier for the user. Это идентифицирует начальный логин пользователя и остается постоянным каждый раз, когда пользователь автоматически входит в систему в течение этого постоянного сеанса. Он также содержитa random token, который восстанавливается каждый раз, когда пользователь входит в систему с помощью постоянных функций запоминания.

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

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

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

  1. Войти с Запомнить меня активным

  2. Закройте браузер

  3. Снова откройте браузер и вернитесь на ту же страницу. Обновить.

  4. Вы все равно будете авторизованы

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

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

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

В этом руководстве показано, какset up and configure a database persisted Remember Me Token functionality. Это также продолжение предыдущей статьи, в которой обсуждалисьstandard Cookie Token based functionality. Подход с использованием базы данных более безопасен, так как данные о пароле не сохраняются в cookie-файлах, но он требует немного больше настроек.

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

Related