1

次の状況で問題が発生します。

私のSpring、Hibernateアプリケーションでは、UserEntityとUserCategoryEntityを取得しました。ユーザーエンティティのテーブルは、識別子としてユーザー名を取得しました。このテーブルは古いプログラムでも使用されているため、この識別子フィールドは暗号化できません。これを行うことはできません。

UserCategoryからUserへのManyToOne参照を作成するには、UserCategoryテーブルにユーザーの一意のユーザー名を持つフィールドが必要です。私がやりたいのは、Jasyptを使用してUserCategoryテーブルのユーザー名を暗号化することです。そしてもちろん、この作品:

    @Type(type="encryptedString") 
    @ManyToOne 
    @JoinColumn(name = "username", insertable=false, updatable=false)   
    @ForeignKey(name = "none") 
    public User getUser(){ 
            return this.user; 
    } 
    public void setUser(User user ){ 
            this.user = user; 
    } 

しかし、暗号化されたユーザー名をUserCategoryテーブルに配置した後、Hibernateが暗号化されたフィールドのユーザーを参照できないため、このレコードを使用できません。次のエラーが発生します。

"No row with the given identifier exists: com.foo.bar.models.User#M9LgndiyCsVGqfVRVblb3A=="

これは論理的なエラーですが、良い解決策を知っていますか。コードは最初に復号化してから参照を作成するために何かが必要だと思います。しかし、私はこれを行う方法に固執しています。

4

1 に答える 1

1

カスタムユーザータイプの使用方法を誤解していると思います。前の回答でコメントしたように、ここでは関連付けレベルでカスタムタイプを宣言することは想定されておらず、属性レベル、つまり属性で使用することになっていusernameます。Userエンティティの。

これは実際にはドキュメントで説明されています(Jasyptサイトが現在ダウンしているように見えるためGoogleキャッシュから貼り付けられています):

JasyptとHibernate3の統合

Jasyptは、マッピングされたHibernateエンティティの1つまたは複数のプロパティを暗号化されたタイプとして宣言できるようにorg.jasypt.hibernate.typeするいくつかのHibernateUserType 実装を提供する統合パッケージ()を提供します。暗号化して保存できる型には、文字列、バイナリ(バイト配列)、数値型、ブール値、日付などがあります。

これらのプロパティの永続化は暗号化された方法で行われますが、アプリケーションに対しては完全に透過的な方法で行われます。

これは、個人データやプライベートメッセージなどを暗号化する場合に役立ちます。これにより、「重要な」テーブルへの読み取りアクセス権を持つユーザーがそのすべての内容を読み取ることができなくなります。

Hibernateでの暗号化では、jasyptはパスワードベースの暗号化機能を使用し、PBEStringEncryptor、PBEByteEncryptor、PBEBigIntegerEncryptor、またはPBEBigDecimalEncryptorを実装する暗号化オブジェクトを使用して、ユーザーが作成した暗号化機能も含めてデータを暗号化できます。

ただし、暗号化はHibernateの使用に制限を設定します。セキュリティ標準では、同じデータに対する2つの異なる暗号化操作が同じ値を返さないようにする必要があります(ランダムソルトを使用しているため)。このため、永続化時に暗号化されるように設定されているフィールドは、それらが属するエンティティの検索クエリのWHERE句の一部にすることはできません

したがって、要約すると、1)@Type注釈をに適用する必要がありusernameます。2)username主キーとして使用することはできません(上記の最後の段落で説明したように、結合の一部にすることはできないため)。

これは、次のようなものが必要になることを意味します(適切なものを宣言したと仮定して@TypeDef):

@Entity
public class User {

    @Id @GeneratedValue
    private Long id;

    @Type(type="encryptedString") 
    private String username;

    ...
}

それに応じて関連付けを変更しManyToOneます。

于 2010-07-20T17:15:36.510 に答える