Hibernate 带执行器和自定义安全性的Spring boot OpenSessionInViewFilter
我正在使用SpringBoot创建RESTfulWeb服务。为了安全起见,我通过扩展AbstractUserDetailsAuthenticationProvider使用BasicAuthenticationFilter和自定义AuthenticationProvider。我在控制器类中使用@Secured注释的方法级安全性。这一切都很好,除了我试图让弹簧驱动器工作以及 执行器的问题是,我在尝试验证请求时遇到hibernate异常,因为没有打开任何会话。因此,当我转到时,会出现一个hibernate异常 似乎执行器使用的是与应用程序其余部分分离的过滤链。如果是这样的话,我相信这是有充分理由的。但是,我不知道如何注册我的OpenSessionInViewFilter,使它成为我每个过滤器链中的第一个过滤器。我的OpenSessionInViewFilter是通过FilterRegistrationBean在我的@Configuration类中注册的 Spring boot非常棒,但是在引擎盖下有很多神奇的东西,我还没有弄清楚如何深入挖掘他们的代码,看看从哪里开始,并遵循它 下面是我的一些配置。我试着把我认为重要的东西包括进去。请让我知道,如果有另一件,你想看看 感谢您的帮助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
@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;
}