0

私の spring-maven-jpa ベースの Web アプリでは、一部のデータを DB に格納する直前に暗号化し、DB からプールするときに復号化する必要があります。

そこで私は自分の暗号化サービスを作成しました。

オブジェクト指向の視点から、各エンティティは自分自身を保護および保護解除する方法を知っておく必要があると思います。これにより、暗号化装置を抽象的な基本エンティティに挿入することになります。

public abstract class BaseEntity {

    @Autowired(required = true)
    protected SecurityProvider securityService;

    public BaseEntity() {
    }

    /**
     * secure the entity (if required) using the securityService
     */
    @PrePersist
    @PreUpdate
    protected abstract void secure();

    /**
     * un-secure the entity (if required) using the securityService
     */
    @PostLoad
    protected abstract void unsecure();

    /*--- Getters & Setters ---*/

    public SecurityProvider getSecurityService() {
    return securityService;
    }

    public void setSecurityService(SecurityProvider securityService) {
    this.securityService = securityService;
    }
} 

ご覧のとおり、そのために @PrePersist、@PreUpdate、および @PostLoad コールバックをリレーしようとしています。

現時点では、暗号化プログラムのインジェクションに問題があるため、最後までテストすることはできません。

問題は、それは良い習慣のように見えるかということです。改善またはより良い方法を提案できますか?

アップデート:

いくつかのテストを実行した後、 @PrePersist および @PreUpdate アノテーションが正常に機能し、各エンティティが DB に書き込まれる直前に暗号化されるように見えます。しかし、 @PostLoad は期待どおりに機能していないようです。DB からエンティティをプールするたびに実行されると思っていましたが、何らかの理由でメソッドが呼び出されません。@PostLoad の考え方が間違っていましたか?

4

1 に答える 1

1

「コマンド」設計パターンは、これに適しています。基本的に、暗号化および復号化メソッドを備えた「SecurityClass」というクラスがあります。

タイプ「エンティティ」のパラメーターを取り、それらに対して何らかのタイプの暗号化を実行します。Command デザイン パターンを使用する利点は、Entity 型のすべてのオブジェクトを暗号化でき、継承の必要がないことです。

とは言っても、継承を使用してメソッドをエンティティ クラスの一部にすることは問題ありませんが、「責任主導の設計」の概念によれば、エンティティ自体を暗号化するのはエンティティの仕事なのか、それとも何らかの外部エージェントの仕事なのかということです。 ?

解決策の決定的な答えが見つからない場合があります。これは本質的に数学的な真実に反するモデリングであるためです。個人的にはあなたのやり方の方が理解しやすいと思いますが、コードに設計パターンを実装することは常に良い考えです。

于 2012-12-02T16:11:53.013 に答える