«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() чрезвычайно проста, но при этом остается очень гибкой. через дополнительные опции. Здесь важен ключ — это частный секрет значения для всего приложения, и он будет использоваться при генерации содержимого токена.
Кроме того, время действия токена может быть изменено с двух недель по умолчанию на, например, один день с помощью 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>
Этот путь по умолчанию также можно изменить следующим образом:
4. Файл cookie
.rememberMe().rememberMeParameter("remember-me-new")
Механизм создаст дополнительный файл cookie – файл cookie «запомнить меня» – когда пользователь входит в систему.
Файл cookie «Запомнить меня» содержит следующие данные:
имя пользователя — для идентификации вошедшего в систему принципала expireTime — для истечения срока действия файла cookie; по умолчанию — 2 недели. Хэш MD5 — из двух предыдущих значений — имя пользователя и время истечения срока действия, а также пароль и предопределенный ключ. – это означает, что при изменении одного из них файл cookie становится недействительным. Кроме того, имя пользователя можно прочитать из файла cookie.
-
Кроме того, важно понимать, что этот механизм потенциально уязвим, если файл cookie «запомнить меня» будет перехвачен. Файл cookie будет действительным и пригодным для использования до тех пор, пока не истечет срок его действия или учетные данные не будут изменены.
5. На практике
Чтобы легко увидеть, как работает механизм «запомнить меня», вы можете:
войти в систему с активной функцией «запомнить меня» дождаться истечения срока действия сеанса (или удалить файл cookie JSESSIONID в браузере) обновить страницу
Без функции «Запомнить меня» после истечения срока действия файла cookie пользователь должен быть перенаправлен обратно на страницу входа. С функцией «Запомнить меня» пользователь теперь остается в системе с помощью нового токена/файла cookie.
-
6. Заключение
В этом руководстве показано, как установить и настроить функцию «Запомнить меня» в конфигурации безопасности, а также кратко описано, какие данные попадают в файл cookie.
Реализацию можно найти в примере проекта Github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.
Когда проект запускается локально, доступ к файлу login.html можно получить на локальном хосте.
«
When the project runs locally, the login.html can be accessed on localhost.