磁盘存储ehcache的Spring ACL问题

时间:2014-09-30 21:42:23

标签: spring spring-security acl ehcache

我试图实现Spring ACL,但我遇到了一个问题,我不知道如何解决。

我们有一个运行配置的echache,它是从以下spring环境加载的。

<?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

1 个答案:

答案 0 :(得分:0)

根据EhCache文档,您可以通过将overflowToDisk属性设置为false来关闭缓存的磁盘使用率。所以你可以试试:

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