アノテーションは SpringBoot インターフェースのカスタム属性の暗号化と復号化を実装します。

序文

先月、社内の別のチームが作った新しいプロジェクトは、稼働後は概ね安定していましたが、R&D ディレクターを含む 2 人がプロジェクトの稼働直後に辞め、「ガベージコレクター」である私に引き継がれました。 」。

今週、当事者 A の別のメーカーの監視プラットフォームが、私たちのプロジェクトの一部のインターフェースの機密情報を暗号化なしでスキャンし、直ちに対処するよう私たちに求めてきました。

確認してみると本当にその通りで、携帯電話もID番号も解除されておらず、心の中では一万の獣が駆け回っていた。

幸いなことに、私にはそのような緊急事態に対処するための長期的な経験があります。私はカスタム アノテーションを直接書き、それを暗号化および復号化する必要があるインターフェイスに追加しました。デバッグのためにフロントエンドに接続され、Oak が取得します。その後、顔は重いままですが、心は穏やかで、とても自由に取り組んでいます。

釣りの空き時間を利用して、実装方法を簡略化して最も分かりやすく共有し、保存して、いつか必要なときに釣り出すことができるので、考える時間を節約できます。


テクニカルバージョン

ここに画像の説明を挿入


実装プロセス

1. 依存関係を導入する

ここに画像の説明を挿入

2. エンティティクラス

2 つのエンティティ クラスを定義します。1 つは、ユーザー情報のクエリをシミュレートするときにインターフェイスの応答によって返されるオブジェクト UserInfo です。

ここに画像の説明を挿入

1 つは、ユーザーを保存するときのリクエスト オブジェクト UserInfoReq です。

ここに画像の説明を挿入

このようにして、クエリ インターフェイスによって返されたオブジェクトの機密属性の暗号化と、保存インターフェイスによって要求されたオブジェクトの機密属性の復号化を個別にテストできます。


3.yml設定

ここでは主に、柔軟な変更に便利なキーのカスタム構成を追加します。

ここに画像の説明を挿入


4. カスタム注釈

ここでは、アノテーションにリクエスト時にどの属性を復号化するか、応答時にどの属性を暗号化するかという 2 つのパラメータを定義し、それぞれデフォルト値を指定します。

ここに画像の説明を挿入

5. 暗号化および復号化ツール

暗号化・復号化ツールクラス Hutoolが提供するAES暗号化・復号化ツールを使用します

ここで 2 つの点に注意してください。

1) ツールクラスで yml 設定を取得するには、@component アノテーションを追加し、変数に static を設定する必要があります。ただし、set メソッドの static を削除し、set メソッドに @Value を設定します。そうしないと、発効しない。

2) AES ツールの構築は、Spring コンテナが Bean を初期化した後にロードされるコンテンツを示す @PostConstruct アノテーションに配置する必要があります。直接処理されない場合は、null ポインタ例外がスローされます。

ここに画像の説明を挿入


6.AOPセクション

これは、カスタム アノテーションを備えた AOP アスペクト クラスです。これも特定の実装です。中心的なアイデアは、Java のリフレクション メカニズムを使用することです。いくつかの記述方法は一般的に固定されており、適切に理解できます。理解することはお勧めしません。トラブルにならない程度に。

ここに画像の説明を挿入


7. テストインターフェース

まず、クエリ インターフェイスをテストし、返されたオブジェクトのいくつかの機密属性を暗号化してみましょう。

ここでは、リクエストパラメータが暗号化および復号化されないことを意味する reqPropsName={} を設定し、携帯電話番号、ID 番号を意味する respPropsName={"phone", "idCard", "name"} を設定します。 、返されたオブジェクト内の名前は暗号化されて返されます。

ここに画像の説明を挿入

次に、保存インターフェイスをテストして、リクエスト オブジェクトの暗号化されたプロパティの一部を復号化しましょう。

ここでは、リクエストパラメータの携帯電話番号、IDカード番号、名前を復号化することを意味するreqPropsName={"phone", "idCard", "name"}を設定し、そうでないことを意味するrespPropsName={}を設定します。返されたオブジェクトの暗号化操作を復号化します。

保存インターフェイスが実行された後、このオブジェクトを直接返して、復号化されたかどうかを確認することができます。

ここに画像の説明を挿入


8.効果

クエリ インターフェイスはオブジェクト暗号化効果を返します。

ここに画像の説明を挿入

インターフェースリクエストオブジェクトの復号化効果を保存します。

ここに画像の説明を挿入


要約する

カスタムアノテーションで実現できる機能は数多くありますが、例えば以前書いた再投稿防止アノテーションはAOPの考え方を重視しており、書き方は大体決まっています。

ここでの暗号化および復号化の注釈には依然として制限があります。

1) ここでは Result など、明確なパブリック戻りオブジェクトを持つインターフェイスのみがサポートされます。

2) @RequestBody リクエスト オブジェクトのみがサポートされており、複数の param パラメーターや Map などの他の形式はサポートされておらず、単独で展開できます。

完璧ではありませんが、ほとんどの SpringBoot プロジェクトは仕様に従い、パブリックな戻りオブジェクトを定義しており、リクエスト インターフェイスのほとんどは @RequesetBody によっても受信されるため、一般的には十分です。

AOP の実装面では、リクエスト オブジェクトの種類にも穴がありますので、興味のある方はソース コードをダウンロードして自分で拡張することもできます。

ソースコードはコメント欄に記載します~



元の記事は純粋に手書きですので、少しでも役に立ったと感じたら、高評価ブックマークお願いします〜

仕事での実際の経験と経験を共有し続けます、気に入ったら注目してください〜

おすすめ

転載: blog.csdn.net/xiangyangsanren/article/details/126304625