特定のプロパティをまったく取得しないようにマークする方法はありますか?
ユーザーテーブル内に一意のペッパー行があり、ユーザーが取得された場合にこのペッパーとハッシュ化されたパスワードをロードしたくありません。
リモートクライアントでは必要ないので、誤って渡されないようにしたいと思います。
アプリケーション サーバーでパスワードを再生成または変更する必要がある場合は、名前付きクエリを使用してペッパーを取得できます。
特定のプロパティをまったく取得しないようにマークする方法はありますか?
ユーザーテーブル内に一意のペッパー行があり、ユーザーが取得された場合にこのペッパーとハッシュ化されたパスワードをロードしたくありません。
リモートクライアントでは必要ないので、誤って渡されないようにしたいと思います。
アプリケーション サーバーでパスワードを再生成または変更する必要がある場合は、名前付きクエリを使用してペッパーを取得できます。
インターセプターを実装してonLoad
メソッドをオーバーライドすることもできます: Hibernate インターセプターの詳細については、こちらを参照してください。
onFlushDirty メソッドと onSave メソッドをオーバーライドして Timestamp フィールドを更新するこの戦略を使用しました。私はそれを使用したことはありませんonLoad
。
これは、私が使用した同様のものに基づくインターセプターの例です(テストされていません):
public final class PepperInterceptor extends EmptyInterceptor { /** The Value to set as the Pepper field when loading from the DB. */ private static final String DEFAULT_PEPPER = "[PROTECTED-PEPPER]"; @Override public boolean onLoad(final Object entity, final Serializable id, final Object[] currentState, final Object[] previousState, final String[] propertyNames, final Type[] types) { if (entity instanceof User) { for (int i = 0; i < propertyNames.length; i++) { if (propertyNames[i].equalsIgnoreCase("pepper")) { currentState[i] = DEFAULT_PEPPER; } } return true; } return super.onLoad(entity, id, currentState, previousState, propertyNames, types); }
}
編集:
これについてさらに考えるとDEFAULT_PEPPER
、おそらくupdatable=false
エンティティクラスの列定義のようなものを使用して、値が で上書きされないようにする必要があります
Hibernate では、生成された sql を必要に応じてオーバーライドできます。
@Loader アノテーションが役立つ場合があります。