6

Hiện tại tôi đang tìm hiểu khung công tác Spring, chủ yếu tập trung vào Mô-đun bảo mật. Tôi đã xem một số hướng dẫn liên quan đến đăng ký và đăng nhập. Tôi đã thấy cách sử dụng phổ biến này của thoáng qua từ khóa hoặc @Transient chú thích trên trường mật khẩu trong lớp Người dùng.Chú thích @Transient, chú thích @ org.springframework.data.annotation.Transient, từ khóa tạm thời và lưu trữ mật khẩu

Ứng dụng giả của tôi đang sử dụng Spring Boot + Spring MVC + Spring Security + MySQL.

Tôi biết rằng thoáng qua từ khóa

Java được sử dụng để biểu thị rằng một lĩnh vực không phải là để được đăng.

JPA của @Transient chú thích ...

... xác định rằng tài sản hoặc lĩnh vực không phải là dai dẳng. Nó được sử dụng để chú thích một thuộc tính hoặc một trường của một lớp thực thể, lớp cha được ánh xạ hoặc lớp có thể nhúng.

và org.springframework.data.annotation's @ chú thích thông tin ...

Đánh dấu trường là tạm thời cho khung bản đồ. Do đó, thuộc tính sẽ không được giữ nguyên và không được kiểm tra thêm bởi khung bản đồ.

Trong db MySQL của tôi, tôi có schema spring_demo của tôi trong đó có 3 bảng:

+-----------------------+ 
| Tables_in_spring_demo | 
+-----------------------+ 
| role     | 
| user     | 
| user_role    | 
+-----------------------+ 

Khi tôi đang sử dụng thoáng từ khóa trên các lĩnh vực mật khẩu int lớp người dùng, nó sẽ không được được lưu trữ trong db của MySQL. (Ví dụ: test01)

mysql> select * from user; 
+----+--------+------------------+----------+ 
| id | active | email   | username | 
+----+--------+------------------+----------+ 
| 1 |  1 | [email protected] | test01 | 
+----+--------+------------------+----------+ 
1 row in set (0,00 sec) 

Khi tôi đang sử dụng javax.persistence @Transient chú thích trên các lĩnh vực mật khẩu trong lớp dùng, nó cũng sẽ không được lưu trữ trong db MySQL. (ví dụ: test02)

Nhưng ... khi tôi đang sử dụng chú thích org.springframework.data.annotation @Transient trên trường mật khẩu trong lớp Người dùng nó được lưu trữ trong db của MySQL. (ví dụ: test03) Tại sao lại như vậy?

mysql> select * from user; 
+----+--------+------------------+----------+--------------------------------------------------------------+ 
| id | active | email   | username | password              | 
+----+--------+------------------+----------+--------------------------------------------------------------+ 
| 1 |  1 | [email protected] | test02 |                | 
| 2 |  1 | [email protected] | test03 | $2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO | 
+----+--------+------------------+----------+--------------------------------------------------------------+ 
2 rows in set (0,00 sec) 

câu hỏi chính của tôi là, khi tôi đang sử dụng chú thích @Transient spring.data dựa trường mật khẩu đã kéo dài. Tại sao? Và tại sao tôi nên sử dụng bất kỳ chú thích @Transient nào trên trường mật khẩu?

Cảm ơn bạn đã hướng dẫn và trợ giúp trước!

Trả lời

6

Trong khung công tác Spring bạn có thể sử dụng Mapping Framework để chuyển đổi từ dạng này sang dạng khác. Ví dụ, ứng dụng phía máy chủ java mùa xuân của bạn cần gửi thông tin người dùng tới ứng dụng khách (trang web, ứng dụng dành cho thiết bị di động) ở định dạng JSON.

@Entity 
public class User { 

@Id 
private long id; 

@Column(name = "username") 
private String username; 

@Column(name = "email") 
private String email; 

@Column(name = "password") 
private String password; 

} 

Bây giờ để ánh xạ java này đối tượng thực thể sang định dạng JSON bạn có thể sử dụng một khuôn khổ lập bản đồ (ví dụ jackson: com.fasterxml.jackson.databind.ObjectMapper) hoặc làm điều đó bằng tay.

Các JSON định dạng đầu ra mà bạn sẽ nhận được khi chuyển đổi đối tượng sử dụng từ 2 đến JSON là:

{ 
    "id": 2, 
    "email": "[email protected]", 
    "username": "test03", 
    "password": "$2a$10$UbvmdhfcKxSNr/I4CjOLtOkKGX/j4/xQfFrv3FizxwEVk6D9sAoO" 
} 

Bây giờ nếu bạn nói thêm:

@org.springframework.data.annotation.Transient 
@Column(name = "password") 
private String password; 

và sau đó sử dụng bản đồ Framwwork để một lần nữa tạo JSON cho thực thể người dùng 2 bạn sẽ nhận được:

{ 
    "id": 2, 
    "email": "[email protected]", 
    "username": "test03", 
} 

Lưu ý trường mật khẩu là thiếu đầu ra JSON của bạn. Thats vì @org.springframework.data.annotation.Transient chỉ rõ khung công tác Spring mà Object Mapper bạn đang sử dụng không nên bao gồm giá trị này khi chuyển đổi từ Java Object sang JSON. Cũng cần lưu ý nếu bạn cố gắng tiếp tục duy trì thực thể trên vào cơ sở dữ liệu, nó sẽ vẫn lưu nó vào cơ sở dữ liệu vì @org.springframework.data.annotation.Transient chỉ áp dụng cho các khung bản đồ đối tượng không phải là JPA.

Vì vậy, để tóm tắt:

transient là dành cho tất cả serializations (trên dây, tiết kiệm vào đĩa, tiết kiệm để db)
javax.persistence.Transient là đặc biệt cho JPA DB serialization @org.springframework.data.annotation.Transient là dành cho ObjectMapping Khung serializations sử dụng trong vòng Mùa xuân

+0

Nếu mục đích không bỏ qua trường đó trong khi lưu, bạn có thể sử dụng @Tran sient riêng tư tạm thời Mật khẩu chuỗi; –

+0

Tôi đang học Spring and Spring Security ngay bây giờ và đây là một câu trả lời vô cùng hữu ích trong chi tiết và rõ ràng của nó. Đã đi một bonkers ít cố gắng tìm ra lý do tại sao lĩnh vực mật khẩu của tôi đã không bền bỉ cho db. Cảm ơn bạn! – justinraczak