2016-07-19 9 views
-1

Я использую Apache siro в проекте для реализации безопасности. Я ввел область безопасности с помощью CDI. Я хочу реализовать кеширование аутентификации и авторизации в сиро с помощью Jboss Infinispan. Может кто-нибудь, пожалуйста, поделитесь некоторыми указателями?Реализация кэширования в Apache Shiro с использованием JBoss Infinspan

ответ

0

Вам необходимо реализовать org.apache.shiro.cache.Cache и org.apache.shiro.cache.CacheManager для реализации кэширования в сиро. Если вы хотите использовать infinispan затем выполните следующие действия:

Реализовать org.apache.shiro.cache.Cache

import java.util.Collection; 
import java.util.Set; 

import org.apache.shiro.cache.Cache; 
import org.apache.shiro.cache.CacheException; 


public class InfinispanCache<K, V> implements Cache<K, V> { 


    private final org.infinispan.Cache<K, V> cacheProxy; 

    public InfinispanCache(final org.infinispan.Cache<K, V> cacheProxy) { 
     this.cacheProxy = cacheProxy; 
    } 


    @Override 
    public V get(final K key) throws CacheException { 
     return cacheProxy.get(key); 
    } 


    @Override 
    public V put(final K key, final V value) throws CacheException { 
     return cacheProxy.put(key, value); 
    } 


    @Override 
    public V remove(final K key) throws CacheException { 
     return cacheProxy.remove(key); 
    } 


    @Override 
    public void clear() throws CacheException { 
     cacheProxy.clear(); 
    } 


    @Override 
    public int size() { 
     return cacheProxy.size(); 
    } 


    @Override 
    public Set<K> keys() { 
     return cacheProxy.keySet(); 
    } 


    @Override 
    public Collection<V> values() { 
     return cacheProxy.values(); 
    } 

} 

Реализовать org.apache.shiro.cache.CacheManager

import org.apache.shiro.cache.Cache; 
import org.apache.shiro.cache.CacheException; 
import org.apache.shiro.cache.CacheManager; 
import org.infinispan.manager.CacheContainer; 


public class InfinispanCacheManager implements CacheManager { 


    private final CacheContainer cacheContainer; 

    public InfinispanCacheManager(final CacheContainer cacheContainer) { 
     this.cacheContainer = cacheContainer; 
    } 

    @Override 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public <K, V> Cache<K, V> getCache(final String name) throws CacheException { 
     return new InfinispanCache(cacheContainer.getCache(name)); 
    } 

} 

Inject Контейнер кеша. Он должен работать, если в вашем Realm включен CDI.

import javax.annotation.Resource; 

/** The security cache manager. */ 
    @Resource(lookup = "java:jboss/infinispan/container/<YOUR CACHE CONTAINER NAME>") 
    private EmbeddedCacheManager securityCacheManager; 

Установите менеджер кэша в вашей реализации царств:

setCachingEnabled(true); 
setAuthenticationCachingEnabled(true); 
setAuthorizationCachingEnabled(true); 
setCacheManager(new InfinispanCacheManager(securityCacheManager)); 
setAuthenticationCacheName(authenticationCacheName); 
setAuthorizationCacheName(authorizationCacheName); 

Кроме того, вы можете реализовать его в Shiro с другим кэшированием frameworsk.