2012-12-14 27 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节,但我恐怕没有真正帮助我找出错误的可能性。

欢迎任何和所有建议。

回答