1

SpringセキュリティACLで使用されるACL_SIDテーブルには、列の1つとしてユーザーの名前が含まれています。この値を変更する最良の方法について疑問に思っています。これは、たとえば、既存のユーザーに対応するユーザー名を変更する場合に必要です。JdbcMutableAclServiceこの機能をサポートしているようには見えません。どんな助けでも大歓迎です。

ありがとう、ラグー

4

1 に答える 1

1

クラスを拡張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はスーパークラスのプライベートメンバーであるため、クラス内のそのインスタンスを覚えておく必要があります(提案されたコンストラクターの本体を見てください)。

于 2012-11-14T22:33:13.560 に答える