2012-12-14 54 views
1

我使用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節,但我恐怕沒有真正幫助我找出錯誤的可能性。

歡迎任何和所有建議。

回答