web-dev-qa-db-ja.com

@Transient注釈、@ org.springframework.data.annotation.Transient注釈、一時的なキーワードとパスワードの保存

現在、主にセキュリティモジュールに焦点を当てて、Springフレームワークを学習しています。登録とログインに関連するいくつかのガイドを見てきました。 serクラスのパスワードフィールドにtransientキーワードまたは@ Transientアノテーションがよく使用されるのを見ました。

私のダミーアプリは、Spring Boot + Spring MVC + Spring Security + MySQLを使用しています。

そんなこと知ってる

Javaのtransientキーワードは、フィールドがシリアル化されないことを示すために使用されます。

JPAの@ Transientアノテーション ...

...プロパティまたはフィールドが永続的ではないであることを指定します。エンティティクラス、マップされたスーパークラス、または埋め込み可能なクラスのプロパティまたはフィールドに注釈を付けるために使用されます。

およびorg.springframework.data.annotationの@ Transientアノテーション..

マッピングフレームワークの一時的なフィールドをマークします。したがって、プロパティは永続化されませんであり、マッピングフレームワークによってさらに検査されません。

MySQL dbには、3つのテーブルがあるspring_demoスキーマがあります。

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

Userクラスのパスワードフィールドでtransientキーワードを使用している場合、MySQL dbに保存されません。 (例:test01)

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

Userクラスのパスワードフィールドでjavax.persistence @Transientアノテーションを使用している場合、MySQL dbにも保存されません。 (例:test02)

しかし...... Userクラスのパスワードフィールドでorg.springframework.data.annotation @Transientアノテーションを使用している場合、MySQL dbに保存されます。 (例:test03)なぜですか?

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)

私の主な質問は、spring.dataベースの@Transientアノテーションを使用しているとき、パスワードフィールドが保持されていることです。なぜですか?また、パスワードフィールドで@Transientアノテーションを使用する理由は何ですか?

事前にご指導とヘルプをありがとう!

13
F3R1

Spring Framework内では、Mapping Frameworkを使用して、あるフォームから別のフォームに変換できます。たとえば、春Javaサーバー側アプリケーションは、JSON形式でユーザー情報をクライアント(Webページ、モバイルアプリ)に送信する必要があります。

@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;

}

ここで、このJavaエンティティオブジェクトをJSON形式にマッピングするには、マッピングフレームワークを使用できます(例:jackson:com.fasterxml.jackson.databind.ObjectMapper)または手動で実行します。

ユーザー2オブジェクトをJSONに変換するときに得られるJSON形式の出力は次のとおりです。

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

追加した場合:

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

次に、マッピングフレームワークを使用して、取得するユーザー2エンティティのJSONを再度生成します。

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

JSONフィールドにはパスワードフィールドがありません。それは@org.springframework.data.annotation.Transientは、Java ObjectからJSONへの変換時に、使用しているObject Mapperにこの値を含めるべきではないことを、Springフレームワークに明示しています。

また、上記のエンティティをデータベースに永続化しようとした場合、@org.springframework.data.annotation.Transientは、JPAではなく、オブジェクトマッピングフレームワークにのみ適用されます。

要約すると:

transientはすべてのシリアル化用です(有線、ディスクへの保存、dbへの保存)
javax.persistence.Transientは、JPA DBシリアル化専用です@org.springframework.data.annotation.Transientは、Spring内で使用されるObjectMapping Frameworkのシリアル化用です。

19
Shivam Sinha