1

从 Spring 3.0.0.M4 升级到 3.0.0.RC1 和 Spring Security 3.0.0.M2 到 3.0.0.RC1 后,我不得不使用 security:authentication-manager 标签,而不是像我一样定义 _authenticationManager习惯于 M4/M2。我已经尽力定义它,并最终得到了这个:

<security:authentication-manager alias="authenticationManager">
  <security:authentication-provider user-service-ref="userService">
    <security:password-encoder hash="plaintext"/>
  </security:authentication-provider>
</security:authentication-manager>

当我一次做一个单元测试时,这很好用,并且对于大多数 AJAX 请求它也可以正常工作,但似乎是随机的,我的事务中出现奇怪的错误,我的数据库会话似乎在工作中途关闭。我可以引发这些错误的方法只是从同一个客户端向我的不同控制器发送许多不同的 AJAX 请求,然后其中至少一个会随机失败。下次我尝试时,一个会工作,另一个会失败。

该错误在我的 userDAO 中最常发生,但在其他 DAOS 中也经常发生,异常至少包括以下内容:

  • “java.sql.SQLException:ResultSet 关闭后不允许操作”
  • “org.hibernate.impl.AbstractSessionImpl:errorIfClosed():会话已关闭!”
  • “com.mysql.jdbc.PreparedStatement.fillSendPacket 的 java.lang.NullPointerException(PreparedStatement.java:2439)”
  • “java.util.LinkedHashMap$LinkedHashIterator.nextEntry(未知来源)处的 java.util.ConcurrentModificationException”
  • “org.hibernate.LazyInitializationException:非法访问加载集合”
  • ETC...

以前,我曾经定义一个 _authenticationManager bean,同样的请求就像一个魅力。但是对于 RC1,我不再被允许定义它。它曾经看起来像这样:

<bean id="_authenticationManager" class="org.springframework.security.authentication.ProviderManager">
  <property name="providers">
    <list>
      <bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <property name="userDetailsService" ref="userService"/>
        <property name="passwordEncoder">
          <bean class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder" />
        </property>
      </bean>
    </list>
  </property>
</bean>

我是否错误地定义了我的 security:authentication-manager 以便它将共享来自同一客户端的多个请求的事务?我应该以不同的方式定义它,还是应该定义其他一些安全性:bean?

有什么我误解的东西使我的数据库会话关闭了吗?在我的脑海中,每个请求都有自己的数据库连接和事务。所有的 getter 和 setter 都是同步方法,所以我真的不应该有任何并发​​问题。UI 发出请求的所有 REST 控制器都是 GET 请求并执行只读工作。据我所知,在任何这些请求期间都没有完成任何一次 INSERT/UPDATE/DELETE,并且我检查了数据库日志以验证这一点。

我期待听到您关于如何避免这些竞争条件的建议。

干杯

尼克

PS,我已将问题更新为更具体地表明问题出在安全性:身份验证管理器上(或者在我看来,如果您有提示,这可能是其他很棒的东西)我'从 3.0.0.RC1 开始,我被迫使用而不是我自己的 _authenticationManager

PPS,这是让我明白我无法再定义 _authenticationManager 的线程:SpringSource 论坛帖子

4

1 回答 1

0

似乎我在 DAO 中的数据库会话处理方面遇到了一个大问题,所以我写下了我的问题并将解决方案发布在 StackOverflow 的另一个线程中,并征求人们对解决方案的意见。我希望它不会带来更多问题:-)

干杯

尼克

于 2009-10-27T11:08:37.243 回答