SpringセキュリティACLで使用されるACL_SIDテーブルには、列の1つとしてユーザーの名前が含まれています。この値を変更する最良の方法について疑問に思っています。これは、たとえば、既存のユーザーに対応するユーザー名を変更する場合に必要です。JdbcMutableAclService
この機能をサポートしているようには見えません。どんな助けでも大歓迎です。
ありがとう、ラグー
SpringセキュリティACLで使用されるACL_SIDテーブルには、列の1つとしてユーザーの名前が含まれています。この値を変更する最良の方法について疑問に思っています。これは、たとえば、既存のユーザーに対応するユーザー名を変更する場合に必要です。JdbcMutableAclService
この機能をサポートしているようには見えません。どんな助けでも大歓迎です。
ありがとう、ラグー
クラスを拡張JdbcMutableAclService
し、必要な新しいメソッドを追加できます。
コンストラクターでは、次のインスタンスを作成できますJdbcTemplate
。
public YourClassName(DataSource dataSource, LookupStrategy lookupStrategy, AclCache aclCache) {
super(dataSource, lookupStrategy, aclCache);
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.aclCache = aclCache;
}
これで、新しいメソッドでそれを使用してJdbcTemplate
、SIDのユーザー名を更新できます。
jdbcTemplate.update("update acl_sid set sid = ? where sid = ?", newUsername, oldUsername);
固有の制約について覚えておいてください
constraint unique_uk_1 unique(sid,principal)
JdbcTemplate
失敗した場合に投げることがDataAccessException
できます。たとえばDataIntegrityViolationException
、その名前のSIDがデータベースにすでに存在する場合にスローされます。
トランザクションについても覚えておいてください。
ご覧のとおり、SpringSecurityはAclCache
より効率的に実行するために使用しています。ユーザー名を更新するたびに、そのキャッシュからすべてを削除することをお勧めします。そのための方法を使用することができますvoid clearCache();
。AclCache
はスーパークラスのプライベートメンバーであるため、クラス内のそのインスタンスを覚えておく必要があります(提案されたコンストラクターの本体を見てください)。