转至http://zgzty.blog.163.com/blog/static/83831226201361134047834/ 有删减
自定义一个shiroFilterFactoryBean
import java.util.Map;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.mgt.DefaultFilterChainManager;
import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
import org.apache.shiro.web.servlet.AbstractShiroFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.aomaisoft.openfire.plugin.usionmrg.web.service.permission.PermissionService;
/**
* 自定义shiro过滤器,初始化时从数据库读入url权限
*
* @author 20005
* @createDate 2014-7-23 上午09:38:26
*/
public class MyShiroFilterFactory extends ShiroFilterFactoryBean {
private static ShiroFilterFactoryBean shiroFilterFactoryBean = null;
private static Logger logger = LoggerFactory
.getLogger(MyShiroFilterFactory.class);
/**
* 初始化时加载filterChainDefinitions
*/
public MyShiroFilterFactory() {
super();
// 从数据库中读入URL权限列表
setFilterChainDefinitions(new PermissionService().getAllPermissions());
shiroFilterFactoryBean=this;
}
/**
* 重新加载数据库权限
*
* @author 20005
* @createDate 2014-7-28 下午05:28:04
*/
public static void reloadChainDefinitions() {
AbstractShiroFilter shiroFilter = null;
try {
shiroFilter = (AbstractShiroFilter) shiroFilterFactoryBean
.getObject();
} catch (Exception e) {
logger.error("getShiroFilter from shiroFilterFactoryBean error!", e);
}
PathMatchingFilterChainResolver filterChainResolver = (PathMatchingFilterChainResolver) shiroFilter
.getFilterChainResolver();
DefaultFilterChainManager manager = (DefaultFilterChainManager) filterChainResolver
.getFilterChainManager();
// 清空老的权限控制
manager.getFilterChains().clear();
shiroFilterFactoryBean.getFilterChainDefinitionMap().clear();
shiroFilterFactoryBean
.setFilterChainDefinitions(new PermissionService()
.getAllPermissions());
// 重新构建生成
Map<String, String> chains = shiroFilterFactoryBean
.getFilterChainDefinitionMap();
for (Map.Entry<String, String> entry : chains.entrySet()) {
String url = entry.getKey();
String chainDefinition = entry.getValue().trim().replace(" ", "");
manager.createChain(url, chainDefinition);
}
}
}