我使用JDBC支持的SpringSecurity ACL来管理我的用户创建的对象。创建(可变)Spring Security ACL失败一半时间
我有一个@Service,用于处理ACL受保护对象的CRUD,因此需要生成适当的ACL并存储它们。我标志着整个班级为@事务,我在弹簧security.xml文件配置为
<bean id="oauthTXManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="oauthTXManager" />
这dataSource
在工作(的承诺!),这是一个Postgres数据库,如果这可能是很重要的。
回到@Service。它看起来像这样(部分):
@Autowired
@Qualifier("aclService")
private MutableAclService aclService;
...
public Store createNewProfileWithOwner(Store profile, User owner) {
try {
Connection con = dataSource.getConnection();
PreparedStatement query = con.prepareStatement(PROFILE_INSERT);
...
query.executeUpdate();
Sid sid = new PrincipalSid(owner.getUsername());
Permission p = BasePermission.ADMINISTRATION;
ObjectIdentity oi = new ObjectIdentityImpl(profile);
MutableAcl acl = null;
try {
acl = (MutableAcl) aclService.readAclById(oi);
} catch (NotFoundException e) {
acl = aclService.createAcl(oi);
}
acl.setOwner(sid);
acl.insertAce(acl.getEntries().size(), p, sid, true);
aclService.updateAcl(acl);
profile.setOwner(owner.getUsername());
...
} catch (SQLException e) {
e.printStackTrace();
}
return profile;
}
我有一个脚本,它测试调用此方法的API。大约一半我运行脚本的时间,我在acl = aclService.createAcl(oi)
得到一个错误,在那里创建ACL SpringSecurity尝试读取它,但找不到它。很像this forum中描述的问题。另外50%的时间工作得很好。我可以把它缩小到超过“随机,大约一半的时间”,最好的办法是如果我运行脚本,但它不工作,然后再运行超过四秒但不到二十秒后再运行它,会工作。
奇怪的是,当我检查DB时,SpringSecurity声称它在数据库中找不到的ID肯定存在。
我假设我遇到某种事务或缓存问题。我阅读了Transaction Management的第10.5.6节,但我恐怕没有真正帮助我找出错误的可能性。
欢迎任何和所有建议。