Перейти к основному содержимому

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

· 4 мин. чтения

Задача: Наибольшая подстрока палиндром

Для заданной строки s, верните наибольшую подстроку палиндром входящую в s. Подстрока — это непрерывная непустая последовательность символов внутри строки. Стока является палиндромом, если она читается одинаково в обоих направлениях...

ANDROMEDA 42

1. Обзор

В этом руководстве показано, как включить и настроить функцию «Запомнить меня» в веб-приложении с Spring Security. Настройка приложения MVC с безопасностью и простой формой входа в систему уже обсуждалась.

Механизм сможет идентифицировать пользователя в нескольких сеансах, поэтому первое, что нужно понять, это то, что функция «Запомнить меня» срабатывает только после истечения времени сеанса. По умолчанию это происходит через 30 минут бездействия, но тайм- аут можно настроить в файле web.xml .

Примечание. В этом руководстве рассматривается стандартный подход на основе файлов cookie . Для постоянного подхода ознакомьтесь с руководством Spring Security — Persistent Remember Me .

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

Давайте посмотрим, как настроить конфигурацию безопасности с помощью Java:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {

@Bean("authenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1").password("{noop}user1Pass").roles("USER")
.and()
.withUser("admin1").password("{noop}admin1Pass").roles("ADMIN");
}

@Override
protected void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/anonymous*").anonymous()
.antMatchers("/login*").permitAll()
.anyRequest().authenticated()

.and()
.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/login")
.failureUrl("/login.html?error=true")

.and()
.logout().deleteCookies("JSESSIONID")

.and()
.rememberMe().key("uniqueAndSecret")
;
}
}

Как видите, базовая конфигурация с использованием метода RememberMe() чрезвычайно проста, но при этом остается очень гибкой благодаря дополнительным параметрам. Здесь важен ключ — это приватный секрет значения для всего приложения, и он будет использоваться при генерации содержимого токена.

Кроме того, время действия токена может быть настроено от 2 недель по умолчанию до, например, одного дня с помощью tokenValiditySeconds() :

rememberMe().key("uniqueAndSecret").tokenValiditySeconds(86400)

Мы также можем взглянуть на эквивалентную конфигурацию XML:

<http use-expressions="true">
<intercept-url pattern="/anonymous*" access="isAnonymous()" />
<intercept-url pattern="/login*" access="permitAll" />
<intercept-url pattern="/**" access="isAuthenticated()" />

<form-login login-page='/login.html'
authentication-failure-url="/login.html?error=true" />
<logout delete-cookies="JSESSIONID" />

<remember-me key="uniqueAndSecret"/>
</http>

<authentication-manager id="authenticationManager">
<authentication-provider>
<user-service>
<user name="user1" password="{noop}user1Pass" authorities="ROLE_USER" />
<user name="admin1" password="{noop}admin1Pass" authorities="ROLE_ADMIN" />
</user-service>
</authentication-provider>
</authentication-manager>

3. Форма входа

Форма входа аналогична той, которую мы использовали для входа в форму :

<html>
<head></head>

<body>
<h1>Login</h1>

<form name='f' action="login" method='POST'>
<table>
<tr>
<td>User:</td>
<td><input type='text' name='username' value=''></td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='password' /></td>
</tr>
<tr>
<td>Remember Me:</td>
<td><input type="checkbox" name="remember-me" /></td>
</tr>
<tr>
<td><input name="submit" type="submit" value="submit" /></td>
</tr>
</table>
</form>

</body>
</html>

Обратите внимание на недавно добавленный ввод флажка — отображение на « запомнить меня» . Этого добавленного ввода достаточно, чтобы войти в систему с активной функцией «Запомнить меня».

Этот путь по умолчанию также можно изменить следующим образом:

.rememberMe().rememberMeParameter("remember-me-new")

4. Печенье

Механизм создаст дополнительный файл cookie — файл cookie «запомнить меня» — когда пользователь входит в систему.

Файл cookie « Запомнить меня» содержит следующие данные:

  • имя пользователя — для идентификации вошедшего в систему принципала
  • expireTime – для истечения срока действия куки; по умолчанию 2 недели
  • Хэш MD5 — из двух предыдущих значений — имени пользователя и expireTime , плюс пароль и предопределенный ключ

Первое, на что следует обратить внимание, это то, что и имя пользователя , и пароль являются частью файла cookie. Это означает, что если они будут изменены, файл cookie больше недействителен. Кроме того, имя пользователя можно прочитать из файла cookie.

Кроме того, важно понимать, что этот механизм потенциально уязвим, если файл cookie «запомнить меня» будет перехвачен. Файл cookie будет действительным и пригодным для использования до тех пор, пока не истечет срок его действия или учетные данные не будут изменены.

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

Чтобы легко увидеть, как работает механизм «запомнить меня», вы можете:

  • войти в систему с активной функцией «Запомнить меня»
  • дождитесь истечения срока действия сеанса (или удалите файл cookie JSESSIONID в браузере)
  • обновите страницу

Если функция «Запомнить меня» не активна, после истечения срока действия файла cookie пользователь должен быть перенаправлен обратно на страницу входа . С функцией «Запомнить меня» пользователь теперь остается в системе с помощью нового токена/файла cookie.

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

В этом руководстве показано, как установить и настроить функцию «Запомнить меня» в конфигурации безопасности, а также кратко описано, какие данные входят в файл cookie.

Реализацию можно найти в примере проекта Github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.

Когда проект выполняется локально, доступ к файлу login.html можно получить на локальном хосте .