繁体   English   中英

使用事务包装Spring Security自定义身份验证提供程序

[英]Wrapping Spring Security custom authentication provider with transaction

在我的自定义身份验证提供程序中,我能够通过我的Service API获取域对象,但是当我从一个域对象爬到另一个域对象以获得某些值来执行其他检查时,Spring抱怨Hibernate会话不存在: -

domain.getAnotherDomain().getProperty(); // epic FAIL

我有以下AOP事务用事务包装我的所有项目API,我很确定我的自定义身份验证提供程序属于以下模式: -

<tx:advice id="txAdvice">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:advisor pointcut="execution(* my.project..*.*(..))" advice-ref="txAdvice" />
</aop:config>

我也配置了OpenSessionInView过滤器,但我认为无论如何都不适用于Spring Security。

我想我可以创建一个特定的服务API来执行所有必需的检查,但我很好奇为什么我无法使用正确的事务包装我的自定义身份验证提供程序。

任何解释? 谢谢。

我的解决方法是创建一个服务API来执行检查,以避免我的自定义身份验证提供程序中的延迟加载错误。

Spring抱怨Hibernate会话不存在

我不太确定我会回答你的所有问题,但我认为上述陈述代表了你的主要问题,对吗? 你没有提供任何堆栈跟踪,但我想这是臭名昭着的“没有会话或会话关闭”,这是你刚刚描述的场景的典型情况:

。domain.getAnotherDomain()的getProperty(); //史诗失败

也许我错过了一些东西,但我认为典型的答案也适用于此:使用fetch=FetchType.EAGER映射您的关系,这样您就不必在会话已经关闭时延迟加载它。

您尚未发布任何可让我们提出任何有意义建议的代码。

但是自定义身份验证提供程序的一个问题可能是您可能将@Transactional标记为一个抽象方法,该方法将覆盖并从抽象类实例中调用。

例如来自AbstractUserDetailsAuthenticationProvider的 retreiveUser 从实例中调用此方法(请参阅方法authenticate ),因此无法通过AOP代理机制初始化事务。 有关更多详细信息,请检查@Transactional方法调用另一个没有@Transactional anotation的方法?

Spring声明式事务模型使用AOP代理。 所以AOP代理负责创建交易。 仅当实例中的方法从实例外部调用时,AOP代理才会处于活动状态。

我遇到了同样的问题,原因是我在web.xml文件中的OpenSessionInView过滤器之前声明了Spring Security的过滤器。 一旦我换掉它们,问题就消失了。

原因是因为在OpenSessionInView过滤器打开Hibernate会话之前调用了Spring Security,因此没有打开会话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM