現在、主にセキュリティモジュールに焦点を当てて、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アノテーションを使用する理由は何ですか?
事前にご指導とヘルプをありがとう!
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のシリアル化用です。