6

Obecnie uczę się struktury Spring, głównie koncentrując się na jej module bezpieczeństwa. Oglądałem kilka poradników związanych z rejestracją i logowaniem. Widziałem to powszechne użycie słowa kluczowego transient lub @Transient w polu hasła w klasie User.@Adransient adnotation, @ org.springframework.data.annotation.Advertient adnotacja, tymczasowe przechowywanie słów kluczowych i haseł

Moja fikcyjna aplikacja używa Spring Boot + Spring MVC + Spring Security + MySQL.

wiem, że przemijający kluczowe

Javy jest używany do określenia, że ​​pole nie może być w odcinkach.

WZP @Transient adnotacja ...

... określa, że ​​nieruchomość lub pole nie jest trwała. Służy do adnotowania właściwości lub pola klasy encji, mapowanej superklasy lub klasy embedable.

a org.springframework.data.annotation za @Transient adnotacja ...

Zaznacza pole jako przejściowe dla struktury mapowania. W związku z tym właściwość nie będzie zachowywana w postaci i nie będzie dalej sprawdzana przez strukturę mapowania.

W moim db MySQL mam schematu spring_demo który ma 3 tabele:

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

Kiedy używam przemijające słowa kluczowego w polu hasła int klasy User, nie byłoby przechowywane w bazie danych MySQL. (Przykład: test01 pasuje)

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

Kiedy używam javax.persistence @Transient adnotacji w polu hasło w klasie użytkownika, to też by nie być przechowywane w db MySQL. (Przykład: test02)

... Ale gdy używam org.springframework.data.annotation @Transient adnotacji w polu hasło w klasie User to nie przechowywanej w db MySQL. (przykład: test03) Dlaczego tak jest?

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) 

Moje główne pytania, kiedy używam spring.data oparciu @Transient adnotacji pole hasło przetrwała. Czemu? I dlaczego powinienem używać adnotacji @Transient na polu hasła?

Dziękujemy za wskazówki i pomoc z góry!

Odpowiedz

6

W ramach Spring Framework można użyć Mapping Framework do konwersji z jednej formy do drugiej. Załóżmy na przykład, że twoja aplikacja po stronie serwera Java wymaga przesłania informacji o użytkowniku do klienta (strona internetowa, aplikacja mobilna) w formacie 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; 

} 

Teraz mapować tej jednostki java obiekt do formatu JSON można użyć ramy odwzorowania (np Jackson: com.fasterxml.jackson.databind.ObjectMapper) lub zrobić to ręcznie.

wyjście Format

JSON, które można uzyskać, gdy do konwersji użytkownik 2 obiektu do JSON jest:

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

Teraz jeśli dodano:

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

a następnie wykorzystywane mapowanie Framwwork ponownie generować JSON dla podmiotu użytkownika 2:

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

Uwaga pole hasła to brakuje ci wyjścia JSON. To dlatego, że @org.springframework.data.annotation.Transient konkretnie określa strukturę sprężystą, której używał program Object Mapper, nie powinien uwzględniać tej wartości podczas konwersji z Javy do JSON.

Należy również pamiętać, że jeśli próbujesz utrwalić powyższy obiekt w bazie danych, nadal będzie on zapisywany w bazie danych, ponieważ @org.springframework.data.annotation.Transient ma zastosowanie tylko do struktur odwzorowania obiektów, a nie do JPA.

Przypomnę więc:

transient jest dla wszystkich serializations (ponad drutu, zapisywanie na dysku, oszczędzając do db)
javax.persistence.Transient jest specjalnie dla JPA DB serializacji @org.springframework.data.annotation.Transient jest dla serializations ObjectMapping ramowych stosowanych w wiosna

+0

Jeśli celem nie jest ignorowanie tego pola podczas zapisywania, można użyć @Tran sient prywatne hasło przejściowe Hasło; –

+0

Obecnie uczę się Spring and Spring Security, a to była niezwykle przydatna odpowiedź w szczegółach i jasności. Trochę szaleje, próbując dowiedzieć się, dlaczego moje pole hasła nie utrzymało się w bazie danych. Dziękuję Ci! – justinraczak

Powiązane problemy