Spring Security với Maven

Người dịch: Nguyễn Thành Trung - Học viên lớp Java08
Email liên hệ: nguyenthanhtrung.nlk58@gmail.com
Bài viết gốc: https://www.baeldung.com/spring-security-with-maven

1. Tổng quát

Trong bài viết này, chúng ta sẽ giải thích cách thiết lập Spring Security với Maven và xem xét các trường hợp sử dụng cụ thể của việc sử dụng các dependencies Spring Security. Có thể tìm thấy các bản phát hành Spring Security mới nhất trên Maven Central.

Đây là phần tiếp theo của bài viết Spring with Maven trước đó , vì vậy đối với các non-security Spring dependencies, đó là nơi để bắt đầu.

2. Spring Security với Maven

2.1. Spring-security-core

Hỗ trợ Core Spring Security - spring-security-core - chứa chức năng kiểm soát truy cập và xác thực. Dependency này bắt buộc phải bao gồm cho tất cả các dự án sử dụng Spring Security.

Ngoài ra, spring-security-core hỗ trợ các ứng dụng độc lập (không phải web), phương thưc mức độ bảo mật và JDBC:

<properties>
    <spring-security.version>5.3.4.RELEASE</spring-security.version>
    <spring.version>5.2.8.RELEASE</spring.version>
</properties>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>${spring-security.version}</version>
</dependency>

Lưu ý rằng Spring và Spring Security có lịch phát hành khác nhau, vì vậy không phải lúc nào cũng có sự trùng khớp 1 : 1 giữa các số phiên bản.

Nếu bạn đang làm việc với các phiên bản cũ hơn của Spring - điều rất quan trọng cần hiểu là thực tế là, Spring Security 4.1.x không phụ thuộc vào các bản phát hành Spring 4.1.x! Ví dụ: khi Spring Security 4.1.0 được phát hành, Spring core framework đã ở mức 4.2.x và do đó bao gồm phiên bản đó làm dependency của nó. Kế hoạch là sắp xếp các phụ thuộc này chặt chẽ hơn trong các bản phát hành trong tương lai - xem JIRA này để biết thêm chi tiết - nhưng hiện tại, điều này có ý nghĩa thực tế mà chúng ta sẽ xem xét tiếp theo.

2.2. Spring-security-web

Để thêm Web support cho Spring Security , chúng ta cần spring-security-web dependency:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>${spring-security.version}</version>
</dependency>

Điều này chứa các bộ lọc và cơ sở hạ tầng bảo mật web liên quan cho phép kiểm soát truy cập URL trong môi trường Servlet.

2.3. Spring Security and Older Spring Core Dependencies Problem

Dependency mới này cũng cho thấy một vấn đề đối với Maven dependency graph. Như đã đề cập ở trên, Spring Security jars không phụ thuộc vào các Spring core jars mới nhất (mà là trên phiên bản trước). Điều này có thể dẫn đến các dependencies cũ hơn này nằm trên đường dẫn classpath thay vì các tạo tác Spring 5.x mới hơn.

Để hiểu tại sao điều này lại xảy ra, chúng ta cần xem cách Maven giải quyết xung đột. Trong trường hợp xung đột phiên bản, Maven sẽ chọn jar gần root nhất. Ví dụ: spring-core được xác định bởi cả spring-orm (với phiên bản 5.0.0 .RELEASE ) mà còn bởi spring-security-core (với phiên bản 5.0.2.RELEASE ). Vì vậy, trong cả hai trường hợp, spring-jdbc được xác định ở bề sâu 1 từ pom gốc của dự án của chúng ta. Do đó, sẽ thực sự quan trọng về thứ tự mà spring-orm và spring-security-core được xác định trong pom của chính chúng ta. Người đầu tiên sẽ được ưu tiên chúng ta có thể kết thúc với một trong hai phiên bản trên classpath của chúng ta.

Để giải quyết vấn đề này, chúng ta sẽ phải xác định rõ ràng một số phụ thuộc Spring trong pom của riêng chúng ta và không dựa vào cơ chế quyết định Maven dependency ngầm định. Làm điều này sẽ đặt dependency cụ thể đó ở bề sâu 0 từ pom của chúng ta (vì nó được định nghĩa trong chính pom) vì vậy nó sẽ được ưu tiên. Tất cả những điều sau đây thuộc cùng một danh mục và tất cả đều cần được xác định rõ ràng, trực tiếp hoặc, đối với các dự án nhiều mô-đun, trong phần tử dependency Management của phần tử cha:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>${spring-version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring-version}</version>
</dependency>

2.4. Spring-security-config and Others

Để sử dụng Spring Security XML namespace and annotations, chúng ta sẽ cần spring-security-config dependency:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>${spring-security.version}</version>
</dependency>

Cuối cùng, hỗ trợ LDAP, ACL, CAS, OAuth và OpenID có các phụ thuộc riêng trong Spring Security: spring-security-ldap , spring-security-acl , spring-security-cas, spring-security-oauth và spring-security-openid.

3. Sử dụng Spring Boot

Khi làm việc với Spring Boot, trình khởi động spring-boot-starter-security sẽ tự động bao gồm tất cả các dependencies như spring-security-core , spring-security-web và spring-security-config trong số những phần khác:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.3.3.RELEASE</version>
</dependency>

Vì Spring Boot sẽ tự động quản lý tất cả dependencies cho chúng ta, điều này cũng sẽ loại bỏ vấn đề bảo mật spring và các core dependencies cũ hơn đã đề cập trước đây.

4. Sử dụng Snapshots and Milestones

Spring Security milestones, cũng như Snapshots, có sẵn trong Maven repositories tùy chỉnh do Spring cung cấp. Để biết thêm chi tiết về cách định cấu hình những thứ này, hãy xem cách sử dụng Snapshots and Milestones.

5. Kết luận

Trong hướng dẫn nhanh này, chúng ta đã thảo luận về các chi tiết thực tế của việc sử dụng Spring Security với Maven . Các phụ thuộc Maven được trình bày ở đây tất nhiên là một số trong số những phụ thuộc chính, và có một số phụ thuộc khác có thể đáng được đề cập và chưa được thực hiện. Tuy nhiên, đây sẽ là một điểm khởi đầu tốt để sử dụng Spring trong một dự án hỗ trợ Maven.