我使用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節,但我恐怕沒有真正幫助我找出錯誤的可能性。
歡迎任何和所有建議。