gpt4 book ai didi

java - 启用@EnableGlobalMethodSecurity 后,Hibernate 无法再获取 session

转载 作者:行者123 更新时间:2023-11-30 10:53:52 25 4
gpt4 key购买 nike

我正在尝试为 Spring Web 应用程序实现基于 ACL 的授权。一旦我将 @EnableGlobalMethodSecurity(prePostEnabled = true) 注释添加到我的安全配置类中,Hibernate 事务 session 处理就会中断,每当我尝试保存一个对象时,我都会得到:Could not obtain当前线程的事务同步 session 。我怀疑我错误地配置了一些与我的 ACL 缓存相关的东西,因为当我从我的配置中删除相关方法时问题也会消失(同时我的类仍然用 @EnableGlobalMethodSecurity(prePostEnabled = true) 注释)。这些是我的配置中的相关方法:

@Bean
public RoleHierarchyImpl roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_ADMINISTRATOR > ROLE_MONITOR > ROLE_USER");
return roleHierarchy;
}

/**
* ACL audit logger (print ACL audits to console)
* @return
*/

@Bean
ConsoleAuditLogger auditLogger(){
return new ConsoleAuditLogger();
}

/**
* Caches ACL permissions to reduce database load
* @return AclCache
*/

@Bean
SpringCacheBasedAclCache aclCache(){
PermissionGrantingStrategy permissionGrantingStrategy =
new DefaultPermissionGrantingStrategy(auditLogger());


return new SpringCacheBasedAclCache(cacheManager().getCache("aclCache"), permissionGrantingStrategy, aclAuthorizationStrategy());
}

@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}

/**
* Cache manager factory to create the cached based on the settings in "/WEB-INF/ehcache.xml"
* @return EhCacheManagerFactoryBean
*/

@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
cmfb.setConfigLocation(new ServletContextResource(servletContext, "/WEB-INF/ehcache.xml"));
cmfb.setShared(true);
return cmfb;
}


@Bean
AclAuthorizationStrategyImpl aclAuthorizationStrategy(){
return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMINISTRATOR"), new SimpleGrantedAuthority("ROLE_ADMINISTRATOR"), new SimpleGrantedAuthority("ROLE_ADMINISTRATOR"));
}

@Bean
AclPermissionEvaluator permissionEvaluator() {
return new AclPermissionEvaluator(aclService());
}

@Bean
JdbcMutableAclService aclService() {
return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache());
}

@Bean
BasicLookupStrategy lookupStrategy(){
return new BasicLookupStrategy(dataSource, aclCache(), aclAuthorizationStrategy(), auditLogger());
}

/**
* Returns an expression handler based upon the specified role hierarchy and permission evaluator
* @return
*/

@Bean
public DefaultMethodSecurityExpressionHandler expressionHandler(){
DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
expressionHandler.setPermissionEvaluator(permissionEvaluator());
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}

我正在使用 Spring 4.2.2、Hibernate Entitymanager 5.0.3 和 Spring Security 4.0.3。这该死的事情已经困扰我好几个小时了,我就是找不到解决办法。有什么想法我在这里遗漏了什么吗?

干杯,简

最佳答案

最后我找到了一个解决方案,主要是因为这篇 SO 帖子:Spring Hibernate - Could not obtain transaction-synchronized Session for current thread .

作者总结道:

Do not autowire beans into GlobalMethodSecurityConfiguration => they will not get intercepted properly afterwards.

这正是发生的事情。我的 CustomUserDetailsS​​ervice bean 在安全配置类中 Autowiring ,事务性 loadByUserName 方法停止工作,因为 TransactionInterceptor 忽略了这个 bean。

基本上,我将所有与 ACL 相关的内容与 @EnableGlobalMethodSecurity(prePostEnabled = true) 注释一起移动到一个单独的配置文件中,所有内容立即开始按预期工作(包括基于 ACL 的授权)。这让我非常头疼,我希望我能帮助别人解决这个问题。

关于java - 启用@EnableGlobalMethodSecurity 后,Hibernate 无法再获取 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33850136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com