/*
* Copyright 2005-2010 the original author or autors
*
* http://www.skyon.com.cn
*
* Project { SkyonFramwork }
*/
package com.skyon.um.security.acegi.intercept.web;
import net.sf.acegisecurity.ConfigAttributeDefinition;
import net.sf.acegisecurity.ConfigAttributeEditor;
import net.sf.acegisecurity.intercept.web.FilterInvocationDefinitionMap;
import net.sf.acegisecurity.intercept.web.FilterInvocationDefinitionSource;
import net.sf.acegisecurity.intercept.web.PathBasedFilterInvocationDefinitionMap;
import net.sf.acegisecurity.intercept.web.RegExpBasedFilterInvocationDefinitionMap;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
import com.skyon.framework.spring.ehcache.CacheUtils;
import com.skyon.framework.spring.ehcache.SerializableObjectProvider;
import com.skyon.framework.spring.support.MandatorySingletonBeanSupport;
/**
* @since 2005-8-7
* @author 王政
* @version $Id: EhCacheBasedFilterInvocationDefinitionSourceCache.java,v 1.2 2005/11/17 09:38:25 wangzheng Exp $
*/ publicclass EhCacheBasedFilterInvocationDefinitionSourceCache extends MandatorySingletonBeanSupport
implements FilterInvocationDefinitionSourceCache, InitializingBean {
privatestaticfinal Log logger = LogFactory.getLog(EhCacheBasedFilterInvocationDefinitionSourceCache.class);
privateint resourceExpression;
privateboolean convertUrlToLowercaseBeforeComparison = false;
private ResourceMappingProvider resourceMappingProvider;
private Cache cache;
privateObject lock = newObject();
/**
* @see
com.skyon.um.security.acegi.intercept.web.FilterInvocationDefinitionSourceCache#getFilterInvocationDefinitionSource()
*/
public FilterInvocationDefinitionSource getFilterInvocationDefinitionSource(){
synchronized (lock){
Element element = CacheUtils.get(getCache(), "key");
if(element == null){
FilterInvocationDefinitionSource definitionSource = (FilterInvocationDefinitionSource) getFilterInvocationDefinitionSourceFromBackend();
element = newElement("key", new SerializableObjectProvider(definitionSource));
getCache().put(element);
}
return(FilterInvocationDefinitionSource)((SerializableObjectProvider) element.getValue()).getSourceObject();
}
}
publicvoid flushCache(){
CacheUtils.flushCache(getCache());
getFilterInvocationDefinitionSource();
}
private FilterInvocationDefinitionMap getFilterInvocationDefinitionSourceFromBackend(){
logger.info(" 开始加载系统资源权限数据到缓存... ");
FilterInvocationDefinitionMap definitionSource = null;
switch(resourceExpression){
case REOURCE_EXPRESSION_PERL5_REG_EXP : {
definitionSource = new RegExpBasedFilterInvocationDefinitionMap();
break;
}
case RESOURCE_EXPRESSION_ANT_PATH_KEY : {
definitionSource = new PathBasedFilterInvocationDefinitionMap();
break;
}
default : {
throwException();
}
}
definitionSource.setConvertUrlToLowercaseBeforeComparison(isConvertUrlToLowercaseBeforeComparison());
ResourceMapping[] mappings = getResourceMappingProvider().getResourceMappings();
if(mappings == null || mappings.length ==0){
return definitionSource;
}
for(int i = 0; i < mappings.length; i++){
ResourceMapping mapping = mappings[i];
String[] recipents = mapping.getRecipients();
if(recipents == null || recipents.length == 0){
if(logger.isErrorEnabled()){
logger.error("Notice, the resource : " + mapping.getResourcePath() + " hasn't no recipents, it will access by any one ! ");
}
continue;
}
StringBuffer valueBuffer = new StringBuffer();
for (int j = 0; j < recipents.length; j++) {
valueBuffer.append(recipents[j]);
if (j < recipents.length - 1) {
valueBuffer.append(FilterInvocationDefinitionSourceDynamicExtentionEditor.STAND_DELIM_CHARACTER);
}
}
String value = valueBuffer.toString();
addSecureUrl(definitionSource, mapping.getResourcePath(), value);
}
logger.info(" 成功加载系统资源权限数据到缓存 ! ");
return definitionSource;
}
/**
* @param source
* @param name
* @param value
* @throws IllegalArgumentException
*/
private synchronized void addSecureUrl(FilterInvocationDefinitionMap source, String name, String value)
throws IllegalArgumentException {
// Convert value to series of security configuration attributes
ConfigAttributeEditor configAttribEd = new ConfigAttributeEditor();
configAttribEd.setAsText(value);
ConfigAttributeDefinition attr = (ConfigAttributeDefinition) configAttribEd.getValue();
// Register the regular expression and its attribute
source.addSecureUrl(name, attr);
}
public void afterPropertiesSet() throws Exception {
if (resourceExpression != REOURCE_EXPRESSION_PERL5_REG_EXP
&& resourceExpression != RESOURCE_EXPRESSION_ANT_PATH_KEY) {
throwException();
}
Assert.notNull(getResourceMappingProvider(), " resourceMappingProvider must be specified");
Assert.notNull(getCache(), " cache must be specified");
}
/**
* @throws IllegalArgumentException
*/
private void throwException() throws IllegalArgumentException {
throw new IllegalArgumentException("wrong resourceExpression value");
}
/**
* @return Returns the resourceMappingProvider.
*/
public ResourceMappingProvider getResourceMappingProvider() {
return resourceMappingProvider;
}
/**
* @param resourceMappingProvider The resourceMappingProvider to set.
*/
public void setResourceMappingProvider(ResourceMappingProvider resourceMappingProvider) {
this.resourceMappingProvider = resourceMappingProvider;
}
/**
* @return Returns the convertUrlToLowercaseBeforeComparison.
*/
public boolean isConvertUrlToLowercaseBeforeComparison() {
return convertUrlToLowercaseBeforeComparison;
}
/**
* @param convertUrlToLowercaseBeforeComparison The convertUrlToLowercaseBeforeComparison to set.
*/
public void setConvertUrlToLowercaseBeforeComparison(
boolean convertUrlToLowercaseBeforeComparison) {
this.convertUrlToLowercaseBeforeComparison = convertUrlToLowercaseBeforeComparison;
}
/**
* @return Returns the resourceExpression.
*/
public int getResourceExpression() {
return resourceExpression;
}
/**
* @param resourceExpression The resourceExpression to set.
*/
public void setResourceExpression(int resourceExpression) {
this.resourceExpression = resourceExpression;
}
/**
* @return Returns the cache.
*/
public Cache getCache() {
return cache;
}
/**
* @param cache The cache to set.
*/
public void setCache(Cache cache) {
this.cache = cache;
}
}
|