2014-09-30 51 views
0

我试图实现Spring ACL,但是我遇到了一个我不知道如何解决的问题。磁盘存储的弹簧ACL问题ehcache

我们有一个从下面的spring context中加载的echache的运行配置。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:sec="http://www.springframework.org/schema/security" 
     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd 
     http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 

    <!-- Support annotation configuration --> 
    <context:annotation-config /> 
    <context:property-placeholder location="META-INF/test.properties" ignore-unresolvable="true" ignore-resource-not-found="true" /> 



    <!-- Database access --> 
    <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="${db.iwh.driver}" /> 
     <property name="url" value="${db.iwh.url}" /> 
     <property name="username" value="${db.iwh.username}" /> 
     <property name="password" value="${db.iwh.password}" /> 
     <property name="initialSize" value="${db.iwh.initialConnections}" /> 
     <property name="maxActive" value="${db.iwh.maxConnections}" /> 
    </bean> 
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <property name="dataSource" ref="datasource"/> 
    </bean> 

    <!-- JPA with Hibernate --> 
    <util:list id="productEntityPackages"/> <!-- Placeholder --> 
    <util:list id="projectEntityPackages"/> <!-- Placeholder --> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="datasource"/> 
     <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="dk.intelligentsystems.platform.util.spring.ISHibernateJpaVendorAdapter"> 
       <property name="databasePlatform" value="${db.iwh.dialect}"/> 
       <property name="showSql" value="${db.iwh.show_sql}"/> 
       <property name="hbm2ddl" value=""/> 
       <!-- <property name="hbm2ddlImportFiles" value="''"/> --> 
      </bean> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop> 
       <prop key="hibernate.cache.use_second_level_cache">false</prop> 
       <prop key="hibernate.cache.use_query_cache">false</prop> 
       <prop key="hibernate.generate_statistics">false</prop> 
       <prop key="hibernate.cache.default_cache_concurrency_strategy">read-write</prop> 
       <prop key="net.sf.ehcache.configurationResourceName">/META-INF/ehcache.xml</prop> 
       <prop key="hibernate.enable_lazy_load_no_trans">true</prop> 
       <!--prop key="javax.persistence.sharedCache.mode">DISABLE_SELECTIVE</prop--> 
      </props> 
     </property> 
     <!--property name="packagesToScan" ref="entityManagerPackages"/--> 


    <!-- Managing transactions explicitly --> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 
    <bean id="txInterceptor" class="dk.intelligentsystems.platform.tx.ISTransactionInterceptor" /> 
    <aop:config> 
     <!-- Add custom transaction interceptor to all @Transactional methods --> 
     <aop:pointcut id="transactionalMethod" expression="@annotation(org.springframework.transaction.annotation.Transactional) || within(@org.springframework.transaction.annotation.Transactional *)"/> 
     <aop:advisor pointcut-ref="transactionalMethod" advice-ref="txInterceptor" order="1"/> 
    </aop:config> 

    <!-- Task scheduling --> 
    <task:scheduler id="taskScheduler" pool-size="8"/> 
</beans> 

的的Ehcache看起来:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- See http://ehcache.org/documentation/user-guide/hibernate --> 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> 
    <diskStore path="java.io.tmpdir"/> 
    <defaultCache 
      maxElementsInMemory="10000" 
      maxElementsOnDisk="10000" 
      eternal="false" 
      timeToIdleSeconds="120" 
      timeToLiveSeconds="120" 
      diskExpiryThreadIntervalSeconds="120" 
      statistics="true" 
      memoryStoreEvictionPolicy="LRU"/> 


    <cache name="dk.platform.model.Alarm" 
      maxElementsInMemory="2000" 
      eternal="false" 
      timeToIdleSeconds="360" 
      timeToLiveSeconds="360"> 
    </cache> 
    ... 

的ACL这个应用上下文中加载(底部从春季安全接触样品被盗):

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:sec="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

<import resource="spring-test-base.xml"/> 




    <sec:global-method-security pre-post-annotations="enabled" secured-annotations="disabled" jsr250-annotations="disabled" proxy-target-class="true"> 
     <sec:expression-handler ref="expressionHandler" /> 
    </sec:global-method-security> 

    <bean id="expressionHandler" 
     class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
     <property name="permissionEvaluator"> 
      <bean id="permissionevaluator" class="dk.company.util.AuthorizationProvider"> 

      </bean> 
     </property> 
    </bean> 


     <!-- ========= ACL SERVICE DEFINITIONS ========= --> 

    <bean id="aclCache" class="org.springframework.security.acls.domain.EhCacheBasedAclCache"> 
    <constructor-arg> 
     <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean"> 
     <property name="cacheManager"> 
      <bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" /> 

     </property> 
     <property name="cacheName" value="aclCache"/> 
     </bean> 
    </constructor-arg> 
    </bean> 

    <bean id="lookupStrategy" class="org.springframework.security.acls.jdbc.BasicLookupStrategy"> 
    <constructor-arg ref="datasource"/> 
    <constructor-arg ref="aclCache"/> 
    <constructor-arg> 
     <bean class="org.springframework.security.acls.domain.AclAuthorizationStrategyImpl"> 
      <constructor-arg> 
       <bean class="org.springframework.security.core.authority.SimpleGrantedAuthority"> 
        <constructor-arg value="ROLE_ADMINISTRATOR"/> 
       </bean> 
      </constructor-arg> 
     </bean> 
    </constructor-arg> 
    <constructor-arg> 
     <bean class="org.springframework.security.acls.domain.ConsoleAuditLogger"/> 
    </constructor-arg> 
    </bean> 

    <bean id="aclService" class="org.springframework.security.acls.jdbc.JdbcMutableAclService"> 
    <constructor-arg ref="datasource"/> 
    <constructor-arg ref="lookupStrategy"/> 
    <constructor-arg ref="aclCache"/> 
    </bean> 

</beans> 

当我尝试运行应用程序我得到以下例外:

java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99) 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:122) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:312) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 

// Some thousand stack frames... 

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.cache.ehcache.EhCacheFactoryBean#51e88ff6' defined in class path resource [META-INF/spring-authorization-test.xml]: Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: aclCache Cache: Could not create disk store. This CacheManager configuration does not allow creation of DiskStores. If you wish to create DiskStores, please configure a diskStore path. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1482) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:271) 
    ... 45 more 
Caused by: net.sf.ehcache.CacheException: aclCache Cache: Could not create disk store. This CacheManager configuration does not allow creation of DiskStores. If you wish to create DiskStores, please configure a diskStore path. 
    at net.sf.ehcache.store.compound.factories.DiskOverflowStorageFactory.getDataFile(DiskOverflowStorageFactory.java:79) 
    at net.sf.ehcache.store.compound.factories.DiskOverflowStorageFactory.<init>(DiskOverflowStorageFactory.java:71) 
    at net.sf.ehcache.store.compound.impl.OverflowToDiskStore.create(OverflowToDiskStore.java:63) 
    at net.sf.ehcache.Cache.initialise(Cache.java:1113) 
    at net.sf.ehcache.CacheManager.addCacheNoCheck(CacheManager.java:1081) 
    at net.sf.ehcache.CacheManager.addCache(CacheManager.java:987) 
    at org.springframework.cache.ehcache.EhCacheFactoryBean.afterPropertiesSet(EhCacheFactoryBean.java:333) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1541) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1479) 
    ... 48 more 

我试图删除ehcache中的<diskStore path="java.io.tmpdir"/>行,但无济于事。

编辑

Spring版本:3.2.4.RELEASE

的Ehcache版本:4.1.9.Final

+0

你能指出你正在使用的Ehcache和Spring的版本吗? – 2014-10-01 07:13:50

+0

您是否尝试删除行'maxElementsOnDisk =“10000”'? – 2014-10-01 07:58:11

+0

@Serge是的,但没有帮助。 – CodeTower 2014-10-02 11:59:32

回答

0

根据的Ehcache文件,你可以关闭磁盘的使用情况缓存通过将overflowToDisk属性设置为false。所以你可以尝试:

<defaultCache 
     maxElementsInMemory="10000" 
     overflowToDisk="false" 
     eternal="false" 
     timeToIdleSeconds="120" 
     timeToLiveSeconds="120" 
     diskExpiryThreadIntervalSeconds="120" 
     statistics="true" 
     memoryStoreEvictionPolicy="LRU"/>