An ninh mùa xuân Ghi nhớ

1. Khái quát chung

Hướng dẫn này sẽ chỉ ra cách bật và cấu hình chức năng Ghi nhớ trong ứng dụng web với Spring Security. Thiết lập ứng dụng MVC với bảo mật và đăng nhập biểu mẫu đơn giản đã được thảo luận.

Cơ chế này sẽ có thể xác định người dùng trong nhiều phiên - vì vậy điều đầu tiên cần hiểu là Ghi nhớ chỉ hoạt động sau khi phiên hết thời gian. Theo mặc định, điều này xảy ra sau 30 phút không hoạt động, nhưng thời gian chờ có thể được định cấu hình trong web.xml .

Lưu ý: hướng dẫn này tập trung vào cách tiếp cận dựa trên cookie chuẩn . Để biết cách tiếp cận bền bỉ, hãy xem hướng dẫn Spring Security - Kiên trì Ghi nhớ.

2. Cấu hình bảo mật

Hãy xem cách thiết lập cấu hình bảo mật bằng 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") ; } }

Như bạn có thể thấy, cấu hình cơ bản sử dụng phương thức memoryMe () cực kỳ đơn giản trong khi vẫn rất linh hoạt thông qua các tùy chọn bổ sung. Các chính là điều quan trọng ở đây - đó là một bí mật có giá trị riêng cho toàn bộ ứng dụng và nó sẽ được sử dụng khi tạo nội dung của thẻ.

Ngoài ra, thời gian mã thông báo hợp lệ có thể được định cấu hình từ mặc định là 2 tuần đến - ví dụ - một ngày bằng cách sử dụng tokenValiditySeconds () :

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

Chúng ta cũng có thể xem cấu hình XML tương đương:

3. Biểu mẫu đăng nhập

Biểu mẫu đăng nhập tương tự như biểu mẫu chúng tôi đã sử dụng để đăng nhập biểu mẫu:


    
User:
Password:
Remember Me:

Lưu ý đầu vào hộp kiểm mới được thêm vào - ánh xạ để ghi nhớ-tôi . Đầu vào được thêm vào này là đủ để đăng nhập với tính năng nhớ tôi đang hoạt động.

Đường dẫn mặc định này cũng có thể được thay đổi như sau:

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

4. Cookie

Cơ chế sẽ tạo một cookie bổ sung - cookie “nhớ tôi” - khi người dùng đăng nhập.

Các cookie sẽ Ghi nhớ chứa dữ liệu sau:

  • tên người dùng - để xác định tên chính đã đăng nhập
  • expirationTime - để hết hạn cookie; mặc định là 2 tuần
  • MD5 hash - trong số 2 giá trị trước đó - tên người dùngexpirationTime , cùng với mật khẩukhóa xác định trước

Điều đầu tiên cần lưu ý ở đây là cả tên người dùngmật khẩu đều là một phần của cookie - điều này có nghĩa là, nếu một trong hai được thay đổi, cookie không còn hợp lệ. Ngoài ra, tên người dùng có thể được đọc từ cookie.

Ngoài ra, điều quan trọng là phải hiểu rằng cơ chế này có thể dễ bị tấn công nếu cookie nhớ tôi bị bắt. Cookie sẽ hợp lệ và có thể sử dụng cho đến khi nó hết hạn hoặc thông tin đăng nhập được thay đổi.

5. Trong thực tế

Để dễ dàng thấy cơ chế ghi nhớ tôi hoạt động, bạn có thể:

  • đăng nhập với nhớ tôi hoạt động
  • đợi phiên hết hạn (hoặc xóa cookie JSESSIONID trong trình duyệt)
  • làm mới trang

Nếu không nhớ tôi đang hoạt động, sau khi cookie hết hạn, người dùng sẽ được chuyển hướng trở lại trang đăng nhập . Với nhớ tôi, người dùng hiện vẫn đăng nhập với sự trợ giúp của mã thông báo / cookie mới.

6. Kết luận

Hướng dẫn này chỉ ra cách thiết lập và định cấu hình chức năng Ghi nhớ trong cấu hình bảo mật và mô tả ngắn gọn loại dữ liệu nào đi vào cookie.

Việc triển khai có thể được tìm thấy trong dự án Github ví dụ - đây là một dự án dựa trên Eclipse, vì vậy nó sẽ dễ dàng nhập và chạy như nó vốn có.

Khi dự án chạy cục bộ, login.html có thể được truy cập trên localhost.