Cấu hình Spring Security sử dụng WebSecurityConfigurerAdapter và AbstractSecurityWebApplicationInitializer

Trong bài viết giới thiệu về Spring Security, chúng ta đã sử dụng một tập tin cấu hình và khai báo nó cùng với class filter DelegatingFilterProxy để enable Spring Security cho một ứng dụng web bất kỳ. Chúng ta cũng có thể làm được những điều này sử dụng code Java với các class WebSecurityConfigurerAdapter và AbstractSecurityWebApplicationInitializer, được hỗ trợ bởi Spring Security. Cụ thể như thế nào? Chúng ta sẽ tìm hiểu về nó trong bài viết này các bạn nhé!

Đầu tiên, mình sẽ tạo một project Spring MVC sử dụng các interface WebApplicationInitializer và WebMvcConfigurer để làm ví dụ như sau:

Cấu hình Spring Security sử dụng WebSecurityConfigurerAdapter và AbstractSecurityWebApplicationInitializer

với các tập tin AppInitializer.java, SpringConfiguration.java và index.jsp có nội dung như sau:

AppInitializer.java:

SpringConfiguration.java:

index.jsp:

Bây giờ chạy ứng dụng, các bạn sẽ thấy kết quả như sau:

Cấu hình Spring Security sử dụng WebSecurityConfigurerAdapter và AbstractSecurityWebApplicationInitializer

Để làm việc với Spring Security, các bạn cần khai báo thêm các dependencies spring-security-web và spring-security-config như sau:

với:

Chúng ta sẽ sử dụng class WebSecurityConfigurerAdapter để cấu hình cho phần authentication và authorization của Spring Security.

Class WebSecurityConfigurerAdapter là một abstract class implement interface WebSecurityConfigurer định nghĩa các cấu hình mặc định cần thiết cho Spring Security. Chúng ta cần sử dụng class này với annotation @EnableWebSecurity để enable hỗ trợ security cho ứng dụng web của chúng ta.
Bây giờ, mình sẽ tạo mới một class SpringSecurityConfiguration, annotated với annotation @EnableWebSecurity với nội dung ban đầu như sau:

Class WebSecurityConfigurerAdapter có các overloaded method configure() với các tham số khác nhau: AuthenticationManagerBuilder để cấu hình cho phần authentication, HttpSecurity cho phần authorization và WebSecurity để disable access các request tới resource của ứng dụng.

Cho phần authentication thì class AuthenticationManagerBuilder được sử dụng để tạo mới AuthenticationManager, quản lý thông tin user đăng nhập ứng dụng. Class này hỗ trợ chúng ta có thể sử dụng user được lưu trữ in-memory, trong database hoặc LDAP. Để đơn giản, mình sẽ sử dụng user in-memory như sau:

Nếu các bạn muốn định nghĩa thêm user thì có thể sử dụng phương thức and() tiếp theo đoạn code trên, ví dụ:

Cho phần authorization thì class HttpSecurity được sử dụng để định nghĩa request nào được access bởi user với role nào. Ví dụ:

Tượng tự như phần định nghĩa thông tin user, các bạn cũng có thể thêm nhiều định nghĩa cho phần authorization như sau:

Phần disable request tới resource của ứng dụng thì các bạn có thể disable request tới thư mục resources như sau:

Sau khi đã cấu hình xong cho phần authentication và authorization, chúng ta sẽ tiến hành đăng ký class DelegatingFilterProxy với Java web server thông qua Spring container. Chúng ta sẽ sử dụng class AbstractSecurityWebApplicationInitializer để làm điều này.

Các bạn chỉ cần tạo mới một class extends class AbstractSecurityWebApplicationInitializer là được:

Spring sẽ tự động detect instance của class này trong quá trình khởi chạy ứng dụng để đăng ký class DelegatingFilterProxy để sử dụng  springSecurityFilterChain trước bất kỳ các class Filter nào của Java web server.

OK, bây giờ nếu các bạn chạy ứng dụng, các bạn sẽ thấy kết quả như sau:

Cấu hình Spring Security sử dụng WebSecurityConfigurerAdapter và AbstractSecurityWebApplicationInitializer

Ứng dụng của chúng ta đã được enable Spring Security rồi đó các bạn.

Để enable form login mặc định của Spring Security, các bạn cần thêm một đoạn code vào phương thức configure(HttpSecurity http) của class extend class WebSecurityConfigurerAdapter như sau:

Lúc này, chạy lại ứng dụng rồi request tới nó, các bạn sẽ thấy form login mặc định của Spring Security như sau:

Cấu hình Spring Security sử dụng WebSecurityConfigurerAdapter và AbstractSecurityWebApplicationInitializer

Login bằng thông tin user đã khai báo trong phương thức configure(AuthenticationManagerBuilder auth), các bạn sẽ thấy được trang index của ứng dụng của chúng ta.

Chia sẽ bài viết này ...Share on Facebook
Facebook
0Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

Add Comment