Xác thực cơ bản bảo mật mùa xuân

1. Khái quát chung

Hướng dẫn này chỉ ra cách thiết lập, cấu hình và tùy chỉnh Xác thực cơ bản với Spring . Chúng tôi sẽ xây dựng dựa trên ví dụ Spring MVC đơn giản và bảo mật giao diện người dùng của ứng dụng MVC bằng cơ chế Xác thực cơ bản do Spring Security cung cấp.

2. Cấu hình bảo mật mùa xuân

Chúng ta có thể cấu hình Spring Security bằng cách sử dụng Java config:

@Configuration @EnableWebSecurity public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Autowired private MyBasicAuthenticationEntryPoint authenticationEntryPoint; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(passwordEncoder().encode("user1Pass")) .authorities("ROLE_USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/securityNone").permitAll() .anyRequest().authenticated() .and() .httpBasic() .authenticationEntryPoint(authenticationEntryPoint); http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }

Ở đây chúng tôi đang sử dụng phần tử httpBasic () để định nghĩa Xác thực Cơ bản, bên trong phương thức config () của một lớp mở rộng WebSecurityConfigurerAdapter.

Điều tương tự cũng có thể đạt được bằng cách sử dụng XML:

Điều có liên quan ở đây là yếu tố bên trong chính phần tử của cấu hình - điều này là đủ để kích hoạt Xác thực Cơ bản cho toàn bộ ứng dụng. Trình quản lý xác thực không phải là trọng tâm của hướng dẫn này, vì vậy chúng tôi đang sử dụng trình quản lý trong bộ nhớ với người dùng và mật khẩu được xác định trong bản rõ.

Các web.xml của ứng dụng web cho phép Xuân An đã được thảo luận trong phần hướng dẫn xuân Thoát.

3. Sử dụng Ứng dụng Bảo mật

Lệnh curl là công cụ cần thiết của chúng tôi để sử dụng ứng dụng được bảo mật.

Đầu tiên, hãy thử yêu cầu /homepage.html mà không cung cấp bất kỳ thông tin xác thực bảo mật nào:

curl -i //localhost:8080/spring-security-rest-basic-auth/api/foos/1

Chúng tôi nhận lại được 401 Trái phép và Thử thách xác thực dự kiến :

HTTP/1.1 401 Unauthorized Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-mvc-basic-auth/; HttpOnly WWW-Authenticate: Basic realm="Spring Security Application" Content-Type: text/html;charset=utf-8 Content-Length: 1061 Date: Wed, 29 May 2013 15:14:08 GMT

Trình duyệt sẽ giải thích thách thức này và nhắc chúng tôi về thông tin đăng nhập bằng một hộp thoại đơn giản, nhưng vì chúng tôi đang sử dụng curl nên đây không phải là trường hợp.

Bây giờ, hãy yêu cầu cùng một tài nguyên - trang chủ - nhưng cung cấp thông tin đăng nhập để truy cập vào tài nguyên đó:

curl -i --user user1:user1Pass //localhost:8080/spring-security-rest-basic-auth/api/foos/1

Bây giờ, phản hồi từ máy chủ là 200 OK cùng với Cookie :

HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-mvc-basic-auth/; HttpOnly Content-Type: text/html;charset=ISO-8859-1 Content-Language: en-US Content-Length: 90 Date: Wed, 29 May 2013 15:19:38 GMT

Từ trình duyệt, ứng dụng có thể được sử dụng bình thường - điểm khác biệt duy nhất là trang đăng nhập không còn là yêu cầu khó khăn vì tất cả các trình duyệt đều hỗ trợ Xác thực cơ bản và sử dụng hộp thoại để nhắc người dùng nhập thông tin đăng nhập.

4. Cấu hình bổ sung - điểm đầu vào

Theo mặc định, BasicAuthenticationEntryPoint do Spring Security cung cấp trả về một trang đầy đủ cho phản hồi 401 Unauthorized trở lại máy khách. Biểu diễn lỗi HTML này hiển thị tốt trong trình duyệt, nhưng nó không phù hợp với các trường hợp khác, chẳng hạn như API REST, nơi biểu diễn json có thể được ưu tiên hơn.

Không gian tên cũng đủ linh hoạt cho yêu cầu mới này - để giải quyết vấn đề này - điểm nhập có thể bị ghi đè:

Điểm vào mới được định nghĩa là một bean tiêu chuẩn:

@Component public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint { @Override public void commence( HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx) throws IOException, ServletException { response.addHeader("WWW-Authenticate", "Basic + getRealmName() + """); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); PrintWriter writer = response.getWriter(); writer.println("HTTP Status 401 - " + authEx.getMessage()); } @Override public void afterPropertiesSet() throws Exception { setRealmName("Baeldung"); super.afterPropertiesSet(); } }

Bằng cách ghi trực tiếp vào HTTP Response, chúng ta có toàn quyền kiểm soát định dạng của phần thân phản hồi.

5. Sự phụ thuộc của Maven

Các phụ thuộc của Maven dành cho Spring Security đã được thảo luận trước đó trong bài viết Spring Security with Maven - chúng ta sẽ cần cả spring-security-webspring-security-config có sẵn khi chạy.

6. Kết luận

Trong ví dụ này, chúng tôi đã bảo mật một ứng dụng MVC bằng Spring Security và Basic Authentication. Chúng tôi đã thảo luận về cấu hình XML và chúng tôi sử dụng ứng dụng với các lệnh curl đơn giản. Cuối cùng đã kiểm soát được định dạng thông báo lỗi chính xác - chuyển từ trang lỗi HTML tiêu chuẩn sang định dạng văn bản hoặc JSON tùy chỉnh.

Việc triển khai đầy đủ hướng dẫn này có thể được tìm thấy trong dự án GitHub - đây là một dự án dựa trên Maven, 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ộ, HTML mẫu có thể được truy cập tại:

// localhost: 8080 / spring-security-rest-basic-auth / api / foos / 1.