Spring 安全 ACL 中使用的 ACL_SID 表包含用户名作为列之一。我想知道修改此值的最佳方法。例如,当与现有用户对应的用户名发生更改时,这是必需的。它看起来不JdbcMutableAclService
支持此功能。任何帮助表示赞赏。
谢谢,拉古
Spring 安全 ACL 中使用的 ACL_SID 表包含用户名作为列之一。我想知道修改此值的最佳方法。例如,当与现有用户对应的用户名发生更改时,这是必需的。它看起来不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 时,将引发此问题。
还要记住交易。
如您所见,Spring Security 正在使用它AclCache
来提高执行效率。您最好在每次用户名更新时从该缓存中清除所有内容。您可以为此使用void clearCache();
方法。AclCache
是超类的私有成员,因此您需要记住类中的该实例(查看建议的构造函数的主体)。