Cách bảo mật ứng dụng mùa xuân của bạn với bảo mật mùa xuân
Spring Security là một phương tiện hiệu quả để bảo vệ các ứng dụng thông qua các quy trình xác thực và ủy quyền. Theo mặc định, khung này yêu cầu mọi URL hoặc trang web riêng lẻ trong một ứng dụng phải được truy cập bằng thông tin xác thực của một người dùng cuối duy nhất, được công nhận trên toàn cầu.
Phương pháp đề xuất thể hiện khả năng thích ứng đặc biệt. Nó cho phép xây dựng các quy định bảo mật phù hợp cho mọi tuyến yêu cầu HTTP riêng lẻ trong chương trình của bạn, cùng với những người dùng cuối riêng biệt. Do đó, việc loại bỏ các giới hạn bảo mật áp đặt cho các trang web không yêu cầu xác thực người dùng, chẳng hạn như trang chủ, trở nên khả thi. Hơn nữa, phương pháp này cho phép đặc tả các phân công vai trò và cấp độ quyền hạn cho các loại người dùng cụ thể.
Thêm bảo mật mùa xuân vào ứng dụng của bạn
Khi kết hợp Spring Security vào một ứng dụng Spring Boot hiện có hoặc mới được tạo, sẽ tồn tại hai phương pháp triển khai chính. Đầu tiên liên quan đến việc chọn tích hợp trong quá trình tạo dự án Spring Boot mới sử dụng nền tảng Spring Initializr. Ngoài ra, người ta có thể chọn đưa nó vào thông số kỹ thuật bản dựng của dự án bằng cách thêm nó vào danh sách phụ thuộc trong tài liệu nói trên sau khi tạo dự án.
Các tệp cấu hình cho các dự án Gradle được xác định làbuild.gradlekhi được chọn thông qua tùy chọn đầu tiên, trong khi các tệp cấu hình đó trong các dự án Maven được ký hiệu làdaspom.xml.
Tệp build.gradle của bạn phải bao gồm một phần phụ thuộc cụ thể, như được nêu bên dưới:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
}
Tệp XML danh mục đầu tư nói trên dự kiến sẽ bao gồm một độ tin cậy cụ thể, được phác thảo như sau:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Có thể truy cập ứng dụng mẫu được cung cấp thông qua kho lưu trữ GitHub, nơi cung cấp ứng dụng miễn phí theo các điều khoản của giấy phép MIT, cho phép người dùng sử dụng ứng dụng theo các điều kiện được chỉ định.
Sử dụng bảo mật mùa xuân
Khi kết hợp mô-đun Spring Security vào dự án của bạn, giờ đây bạn đã được trang bị để triển khai các chức năng của nó ngay lập tức. Để chứng minh điều này, chỉ cần khởi chạy chương trình của bạn và hướng trình duyệt của bạn đến trang web chính thức của Spring Boot hoặc bất kỳ trang được chỉ định nào trong ứng dụng của riêng bạn. Ví dụ được cung cấp sử dụng bộ điều khiển chính chi phối việc xử lý tiêu chuẩn các yêu cầu đến hướng tới URL được định cấu hình sẵn http://localhost:8080.
package com.springSecurityDemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WebController {
@GetMapping("/")
public String home() {
return "Welcome!";
}
}
Ứng dụng đã nói ở trên, khi kết hợp lớp bộ điều khiển đơn độc đã nói ở trên, mang lại một viễn cảnh ban đầu như sau:
Khi truy cập ứng dụng lần đầu tiên, người dùng sẽ được chuyển hướng đến trang localhost:8080/login. Trước khi có quyền truy cập vào bất kỳ phần nào khác của chương trình, người dùng phải nhập tên người dùng được xác định trước, đó là “người dùng”, cùng với mật khẩu được tạo ngẫu nhiên, có thể tìm thấy trong dấu nhắc lệnh. Dấu nhắc lệnh tạo ra một thông báo tương tự như ví dụ sau:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
Khi khởi động lại ứng dụng sau đó, mật khẩu được tạo tự động sẽ bị thay đổi; tuy nhiên, tên người dùng sẽ không thay đổi. Bằng cách nhập tên người dùng và mật khẩu được xác định trước, một người sẽ được chuyển hướng đến giao diện có liên quan trong ứng dụng.
Tùy chỉnh bảo mật mùa xuân
Để điều chỉnh tính bảo mật của ứng dụng theo các yêu cầu cụ thể của bạn, cần phải sửa đổi cấu hình mặc định do Spring Security cung cấp. Tuy nhiên, trước khi làm như vậy, giả sử rằng bạn đã thiết lập một ứng dụng web cơ bản bằng Spring, có một số điều kiện tiên quyết bổ sung phải được đáp ứng để sử dụng ví dụ cụ thể này:
⭐Dữ liệu mùa xuân JPA
⭐Trình điều khiển JDBC MySQL
⭐Lá xạ hương
⭐Lombok
Việc sử dụng khung Thymeleaf cho phép tạo ra nhiều quan điểm, trong khi Lombok hợp lý hóa quy trình mã hóa trong các cấu trúc lớp dựa trên đối tượng. Hơn nữa, việc tích hợp với thư viện JPA và trình điều khiển MySQL tạo điều kiện tương tác với cơ sở dữ liệu MySQL, mặc dù cơ sở dữ liệu thay thế cũng có thể được sử dụng theo quyết định của người dùng. Để định cấu hình các tương tác như vậy, cần phải điều chỉnh cài đặt cấu hình có trong tệp application.properties nằm trong thư mục tài nguyên.
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
Để thiết lập kết nối với phiên bản cục bộ của MySQL, được ký hiệu là “spring\_security,” sử dụng tên người dùng “root” và mật khẩu “(1234),” bắt buộc mã cấu hình được cung cấp phải được cấu hình đúng cách bằng cách cập nhật thông tin liên quan tương ứng để đảm bảo khả năng tương thích với cấu hình cơ sở dữ liệu cụ thể của một người.
Khi bạn đã thêm bất kỳ phụ thuộc cần thiết nào và thiết lập cơ sở dữ liệu của mình, bạn có thể bắt đầu xác định số lượng phối cảnh mà ứng dụng của bạn sẽ bao gồm. Ngoài ra, điều quan trọng là phải xem xét các biện pháp an ninh tại chỗ cho từng quan điểm. Trong ví dụ minh họa của chúng tôi, có sáu điểm thuận lợi khác biệt được kết hợp trong ứng dụng.
⭐Trang chủ
⭐Trang đăng ký
⭐Trang đăng nhập
⭐Trang đăng xuất
⭐Trang người dùng
⭐Trang lỗi
Để người dùng truy cập thông tin cá nhân của họ trên “trang người dùng”, trước tiên họ phải đăng ký và đăng nhập vào ứng dụng. Chỉ những người đã đăng ký mới được phép xem trang này. Hơn nữa, cần thiết lập thêm bốn gói trong ứng dụng ngoài những gì được cung cấp bởi các dịch vụ tiêu chuẩn của Spring Boot.
Lớp Trình điều khiển Đăng ký
Gói Trình điều khiển bao gồm các lớp chịu trách nhiệm xử lý các yêu cầu HTTP. Thông thường, một lớp trình điều khiển duy nhất xử lý các yêu cầu tương ứng với chức năng của một trang web cụ thể, chẳng hạn như trong ví dụ của lớp WebController. Mặt khác, RegistrationView yêu cầu quản lý các chức năng riêng biệt, do đó cần có một lớp bộ điều khiển riêng chuyên dụng.
@Controller
@RequestMapping("/register")
public class RegistrationController {
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;
public RegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder) {
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm() {
return "registration";
}
@PostMapping
public String processRegistration(RegistrationForm form) {
userRepo.save(form.toUser(passwordEncoder));
return "redirect:/login";
}
}
RegistrationController
phục vụ như một điểm vào cho chức năng bảo mật trong ứng dụng của chúng ta, với việc xử lý các yêu cầu hướng tới localhost:8080/register
. Điều này được biểu thị bằng chú thích @RequestMapping
, chỉ định loại yêu cầu cụ thể mà bộ điều khiển này được thiết kế để xử lý.
Chú thích @GetMapping
biểu thị rằng khi ứng dụng gặp yêu cầu /register
, phương thức registerForm()
chịu trách nhiệm xử lý yêu cầu này và hiển thị chế độ xem đăng ký tương ứng.
Sau khi khách truy cập nhấp vào nút đăng ký, thì chú thích @PostMapping sẽ phát huy tác dụng. Phương thức processRegistration() cho phép bạn đăng dữ liệu người dùng mà nó nhận được từ lớp RegistrationForm lên cơ sở dữ liệu, sử dụng lớp UserRepository. Nhưng trước khi lưu trữ dữ liệu này, phương thức processRegistration() sẽ mã hóa mật khẩu của người dùng bằng Spring’s Giao diện PasswordEncoder.
Tạo cấu hình bảo mật mới
Bằng cách sử dụng phần giới thiệu của Spring 3.1, các nhà phát triển hiện có khả năng sử dụng cách tiếp cận dựa trên Java để định cấu hình Bảo mật mùa xuân thông qua việc sử dụng các lớp thay vì dựa vào các cấu hình dựa trên XML. Cần thiết cho quá trình này là sự bao gồm của
@Configuration
public class SecurityConfiguration {
}
Chú thích @Configuration
biểu thị rằng lớp tiếp theo tạo thành một lớp cấu hình, là công cụ cung cấp các thành phần cho bối cảnh ứng dụng Spring. Vùng chứa này đóng vai trò là phương tiện để Spring xây dựng và quản lý các phần tử (hoặc thành phần) khác nhau của một ứng dụng. Trong lớp SecurityConfiguration
, thành phần ban đầu được cung cấp được biểu thị bằng ký hiệu passwordEncoder
.
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
RegistrationController
dựa trên bean passwordEncoder
để mã hóa các mật khẩu mới được tạo trước khi lưu trữ chúng trong cơ sở dữ liệu. Ngoài ra, SecurityConfiguration
yêu cầu kết hợp bean userDetailsService
để nó hoạt động bình thường.
@Bean
public UserDetailsService userDetailsService(UserRepository userRepo) {
return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
throw new UsernameNotFoundException("Customer '" \+ username \+ "' not found");
};
}
Bean userDetailsService sử dụng Spring Security’s Giao diện UserDetailsService để truy xuất tên người dùng và mật khẩu của người dùng để xác thực , trong phiên đăng nhập của khách hàng. Vì vậy, ngay sau khi khách hàng nhấp vào nút đăng nhập trong chế độ xem đăng nhập, bean userDetailsService sẽ bắt đầu chuyển động.
Thông qua việc sử dụng giao diện UserRepository
, bean userDetailsService
được cấp quyền truy cập vào bộ sưu tập người dùng toàn diện được lưu trữ trong cơ sở dữ liệu. Sau đó, giao diện sử dụng Kho lưu trữ người dùng
để xác định người dùng có thông tin đăng nhập tương ứng với tên người dùng và mật khẩu được cung cấp, sau đó giao diện truy xuất và trả về tất cả thông tin liên quan đến khách hàng cụ thể đó dưới dạng một thực thể tổng hợp.
Sau khi xác thực thành công thông tin đăng nhập được cung cấp, nếu thực thể được truy xuất tương ứng với khách hàng đã đăng ký, họ sẽ được cấp quyền sử dụng các tính năng của nền tảng. Trong trường hợp xác thực không thành công và nhập tên người dùng hoặc mật khẩu không hợp lệ, giao diện sẽ trải qua quá trình tải lại liền mạch, mời người dùng cuối nhập thông tin đăng nhập hợp pháp cho một lần thử khác.
Chuỗi bộ lọc
Spring Security’s Giao diện SecurityFilterChain là giao diện lập trình ứng dụng (API) hữu ích đóng vai trò thiết yếu trong cấu hình Spring Security. Giao diện này hoạt động với Spring Security’s HttpSecurity class để tạo chuỗi bộ lọc cho các yêu cầu HTTP cụ thể.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin-> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout-> logout.logoutSuccessUrl("/logout"));
return http.build();
}
Mã được cung cấp sử dụng lớp HttpSecurity
trong bean filterChain
để thực thi các biện pháp bảo mật bằng cách hạn chế quyền truy cập vào các điểm cuối cụ thể dựa trên vai trò của người dùng. Cụ thể, cấu hình HttpSecurity
chỉ cấp quyền truy cập vào điểm cuối /user
cho những người dùng có vai trò “NGƯỜI DÙNG”, vai trò này được xác định thông qua việc triển khai phương thức getAuthorities()
có trong mọi đối tượng khách hàng mới được tạo.
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
Chuỗi bộ lọc cho phép truy cập không hạn chế vào mọi URL trong ứng dụng cho người dùng chưa được xác thực, vì nó tận dụng các thủ tục đăng nhập và đăng xuất biểu mẫu do lớp HttpSecurity cung cấp.
Việc triển khai các kỹ thuật này cho phép điều hướng liền mạch cho những người dùng đã hoàn thành thành công một hành động. Chẳng hạn, khi nhập thông tin xác thực hợp lệ và nhấp vào nút “Đăng nhập” trên trang “/login”, người dùng sẽ dễ dàng được chuyển hướng đến trang “/user” mà không cần bất kỳ sự can thiệp nào từ phía họ.
Tóm lại, bean filterChain xây dựng và tạo ra một chuỗi bộ lọc, cho phép người dùng cuối được xác thực có quyền truy cập vào nền tảng phần mềm. Chức năng chung của cả ba thành phần trong lớp cấu hình SecurityConfiguration là bảo vệ ứng dụng của bạn khỏi sự truy cập trái phép.
Bean filterChain giữ một vị trí then chốt trong việc xác định cấp ủy quyền cho mọi yêu cầu HTTP đến. Ảnh hưởng của nó tăng lên khi các trang web bổ sung được thêm vào ứng dụng, cho phép bean filterChain thiết lập mức độ bảo mật của chúng.
Lợi ích chính của bảo mật mùa xuân
Spring Security cung cấp một loạt các khả năng để điều chỉnh cả những cá nhân được cấp quyền truy cập và phạm vi quyền được cấp cho những người trong miền ứng dụng của bạn (sử dụng danh sách vai trò người dùng mạnh mẽ của nó). Việc triển khai các cơ chế kiểm soát truy cập hiệu quả được xếp hạng trong số những cân nhắc tối quan trọng khi phát triển các giải pháp phần mềm. Việc cung cấp quyền truy cập tự do cho nhiều người dùng do không đủ các biện pháp hạn chế quyền truy cập có thể vô tình dẫn đến chi phí đáng kể và khả năng vi phạm an ninh.