/**
* Copyright (c) 2005-2009 springside.org.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
*
* $Id: DefinitionSourceFactoryBean.java 764 2009-12-27 19:13:59Z calvinxiu $
*/
package com.wizriver.config;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.ConfigAttributeEditor;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.access.intercept.DefaultFilterInvocationSecurityMetadataSource;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.security.web.access.intercept.RequestKey;
import org.springframework.security.web.util.AntUrlPathMatcher;
import org.springframework.security.web.util.UrlMatcher;
/**
* DefinitionSource工厂.
*
* 由注入的resourceDetailService读取在数据库或其它地方中定义的URL-授权关系,
* 提供LinkedHashMap<String, String>形式的URL及授权关系定义,
* 并最终转为SpringSecurity所需的LinkedHashMap<RequestKey, ConfigAttributeDefinition>形式的定义.
*
* @see org.springframework.security.intercept.web.DefaultFilterInvocationDefinitionSource
* @see ResourceDetailsService
*
* @author calvin
*/
public class DefinitionSourceFactoryBean implements FactoryBean {
private ResourceDetailsService resourceDetailsService;
public void setResourceDetailsService(ResourceDetailsService resourceDetailsService) {
this.resourceDetailsService = resourceDetailsService;
}
/**
* 返回注入了Ant Style的URLMatcher
* 和ResourceDetailService提供的RequestMap的DefaultFilterInvocationDefinitionSource.
*/
public Object getObject() throws Exception {
DefaultFilterInvocationSecurityMetadataSource df = new DefaultFilterInvocationSecurityMetadataSource(
new AntUrlPathMatcher(), buildRequestMap());
return df;
}
/**
* @see FactoryBean#getObjectType()
*/
@SuppressWarnings("unchecked")
public Class getObjectType() {
return FilterInvocationSecurityMetadataSource.class;
}
/**
* @see FactoryBean#isSingleton()
*/
public boolean isSingleton() {
return true;
}
/**
* 提供Ant Style的URLMatcher.
*/
protected UrlMatcher getUrlMatcher() {
return new AntUrlPathMatcher();
}
/**
* 将resourceDetailService提供LinkedHashMap<String, String>形式的URL及授权关系定义
* 转化为DefaultFilterInvocationDefinitionSource需要的LinkedHashMap<RequestKey, ConfigAttributeDefinition>形式.
*/
protected LinkedHashMap<RequestKey, Collection<ConfigAttribute>> buildRequestMap() throws Exception {//NOSONAR
try
{
LinkedHashMap<String, String> srcMap = resourceDetailsService.getRequestMap();
LinkedHashMap<RequestKey, Collection<ConfigAttribute>> distMap = new LinkedHashMap<RequestKey, Collection<ConfigAttribute>>();
for (Map.Entry<String, String> entry : srcMap.entrySet()) {
RequestKey key = new RequestKey(entry.getKey(), null);
//使用SecurityConfig构造List<ConfigAttribute>
SecurityConfig sc = new SecurityConfig(entry.getValue());
List<ConfigAttribute> list = sc.createList(sc.getAttribute());
distMap.put(key, list);
}
return distMap;
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
}