Hibernate 带执行器和自定义安全性的Spring boot OpenSessionInViewFilter

Hibernate 带执行器和自定义安全性的Spring boot OpenSessionInViewFilter,hibernate,spring-mvc,spring-security,spring-boot,spring-boot-actuator,Hibernate,Spring Mvc,Spring Security,Spring Boot,Spring Boot Actuator,我正在使用SpringBoot创建RESTfulWeb服务。为了安全起见,我通过扩展AbstractUserDetailsAuthenticationProvider使用BasicAuthenticationFilter和自定义AuthenticationProvider。我在控制器类中使用@Secured注释的方法级安全性。这一切都很好,除了我试图让弹簧驱动器工作以及 执行器的问题是,我在尝试验证请求时遇到hibernate异常,因为没有打开任何会话。因此,当我转到时,会出现一个hiberna

我正在使用SpringBoot创建RESTfulWeb服务。为了安全起见,我通过扩展AbstractUserDetailsAuthenticationProvider使用BasicAuthenticationFilter和自定义AuthenticationProvider。我在控制器类中使用@Secured注释的方法级安全性。这一切都很好,除了我试图让弹簧驱动器工作以及

执行器的问题是,我在尝试验证请求时遇到hibernate异常,因为没有打开任何会话。因此,当我转到时,会出现一个hibernate异常

似乎执行器使用的是与应用程序其余部分分离的过滤链。如果是这样的话,我相信这是有充分理由的。但是,我不知道如何注册我的OpenSessionInViewFilter,使它成为我每个过滤器链中的第一个过滤器。我的OpenSessionInViewFilter是通过FilterRegistrationBean在我的@Configuration类中注册的

Spring boot非常棒,但是在引擎盖下有很多神奇的东西,我还没有弄清楚如何深入挖掘他们的代码,看看从哪里开始,并遵循它

下面是我的一些配置。我试着把我认为重要的东西包括进去。请让我知道,如果有另一件,你想看看

感谢您的帮助

@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.authorizeRequests().anyRequest().fullyAuthenticated()
            .and().httpBasic().authenticationDetailsSource(new WebAuthenticationDetailsSource()
            {
                @Override
                public WebAuthenticationDetails buildDetails(HttpServletRequest context)
                {
                    return new ThirdPartyAuthenticationDetails(context);
                }
            })
            .and().csrf().disable();
    }
} 

@Configuration
public class WebSecurityConfiguration extends GlobalAuthenticationConfigurerAdapter
{
    @Autowired
    private DataSource dataSource;

    @Autowired
    @Qualifier("thirdPartySystemDAO")
    private EntityDAO<ThirdPartySystem> thirdPartySystemDAO;

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception
    {
        auth.authenticationProvider(authenticationProvider());
    }

    @Bean
    public AuthenticationProvider authenticationProvider()
    {
        ThirdPartyAuthenticationProvider result = new ThirdPartyAuthenticationProvider();
        result.setSecurityService(thirdPartySecurityService());
        return result;
    }

    @Bean
    public ThirdPartySecurityService thirdPartySecurityService()
    {
        ThirdPartySecurityServiceImpl result = new ThirdPartySecurityServiceImpl();
        result.setJdbcTemplate(new JdbcTemplate(dataSource));
        result.setThirdPartySystemDAO(thirdPartySystemDAO);
        return result;
    }
}

注册OpenSessionInViewFilter,在配置类中添加以下代码:

    @Bean
public FilterRegistrationBean registerOpenEntityManagerInViewFilterBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    OpenEntityManagerInViewFilter filter = new OpenEntityManagerInViewFilter();
    registrationBean.setFilter(filter);
    registrationBean.setOrder(5);
    return registrationBean;
}
你必须记住。。。如果您使用的是Hibernate,请声明OpenSessionInViewFilter。但如果您使用的是JPA,请声明OpenEntityManagerViewFilter


祝你好运。

谢谢你的回答,但我已经解决了这个问题。不记得一年多前是怎么回事了。嗨,为什么bean的顺序是“5”?
    @Bean
public FilterRegistrationBean registerOpenEntityManagerInViewFilterBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    OpenEntityManagerInViewFilter filter = new OpenEntityManagerInViewFilter();
    registrationBean.setFilter(filter);
    registrationBean.setOrder(5);
    return registrationBean;
}