apache shiro - 动态创建filterchaindefinitions shiro userfilter
在shrio与spring集成好了以后,调试源码的高人可能已经注意到。项目启动时,shrio通过自己的org.apache.shiro.spring.web.ShiroFilterFactoryBean类的filterChainDefinitions(授权规则定义)属性转换为一个filterChainDefinitionMap,转换完成后交给ShiroFilterFactoryBean保管。ShiroFilterFactoryBean根据授权(AuthorizationInfo类)后的信息去判断哪些链接能访问哪些链接不能访问。filterChainDefinitionMap里面的键就是链接URL,值就是存在什么条件才能访问该链接,如perms、roles。filterChainDefinitionMap是一个Map,shiro扩展出一个Map的子类Ini.Section
现在有一张表的描述实体类,以及数据访问:
@Entity
@Table(name="TB_RESOURCE")
publicclassResourceimplementsSerializable{
//主键id
@Id
privateStringid;
//actionurl
privateStringvalue;
//shiropermission;
privateStringpermission;
//------------------Getter/Setter---------------------//
}
@Repository
publicclassResourceDaoextendsBasicHibernateDao<Resource,String>{
}
通过该类可以知道permission字段和value就是filterChainDefinitionMap的键/值,用springFactoryBean接口的实现getObject()返回Section给filterChainDefinitionMap即可
publicclassChainDefinitionSectionMetaSourceimplementsFactoryBean<Ini.Section>{
@Autowired
privateResourceDaoresourceDao;
privateStringfilterChainDefinitions;
/**
*默认premission字符串
*/
publicstaticfinalStringPREMISSION_STRING="perms["{0}"]";
publicSectiongetObject()throwsBeansException{
//获取所有Resource
Listlist=resourceDao.getAll();
Iniini=newIni();
//加载默认的url
ini.load(filterChainDefinitions);
Ini.Sectionsection=ini.getSection(Ini.DEFAULT_SECTION_NAME);
//循环Resource的url,逐个添加到section中。section就是filterChainDefinitionMap,
//里面的键就是链接URL,值就是存在什么条件才能访问该链接
for(Iteratorit=list.iterator();it.hasNext();){
Resourceresource=it.next();
//如果不为空值添加到section中
if(StringUtils.isNotEmpty(resource.getValue())&&StringUtils.isNotEmpty(resource.getPermission())){
section.put(resource.getValue(),MessageFormat.format(PREMISSION_STRING,resource.getPermission()));
}
}
returnsection;
}
/**
*通过filterChainDefinitions对默认的url过滤定义
*
*@paramfilterChainDefinitions默认的url过滤定义
*/
publicvoidsetFilterChainDefinitions(StringfilterChainDefinitions){
this.filterChainDefinitions=filterChainDefinitions;
}
publicClass>getObjectType(){
returnthis.getClass();
}
publicbooleanisSingleton(){
returnfalse;
}
}
定义好了chainDefinitionSectionMetaSource后修改applicationContext-shiro.xml文件
<beanid="chainDefinitionSectionMetaSource">
<propertyname="filterChainDefinitions">
<value>
/login=authc
/logout=logout
/resource/**=anon
</value>
</property>
</bean>
<beanid="shiroSecurityFilter">
<propertyname="securityManager"ref="securityManager"/>
<propertyname="loginUrl"value="/login.jsp"/>
<propertyname="successUrl"value="/index.jsp"/>
<propertyname="unauthorizedUrl"value="/unauthorized.jsp"/>
<!--shiro连接约束配置,在这里使用自定义的动态获取资源类-->
<propertyname="filterChainDefinitionMap"ref="chainDefinitionSectionMetaSource"/>
</bean>
<beanid="securityManager">
</bean>
<beanid="lifecycleBeanPostProcessor"/>
更多阅读
ppt演示文稿教程:1 如何创建ppt文稿
ppt演示文稿教程:[1]如何创建ppt文稿——简介powerpoint2010的基本操作将介绍多种创建ppt文稿的方法,初步掌握ppt文稿的制作和编辑技术,学会用多种视图方式浏览演示文稿。ppt演示文稿教程:[1]如何创建ppt文稿——工具/原料PowerPoint 2
如何在unity3d中创建天空 unity3d 天空盒子
如何在unity3d中创建天空——简介我们玩各种各样的网络游戏,都会给人一种感觉,那就是觉得这个游戏世界似乎很大、很宽广。这里主要是因为天空盒的原因。有了天空盒,会突然让玩家觉得,这个游戏世界很美,很大。这里简单介绍一下如何在unity
秒点QQ华夏图标方法分享无需进游戏无需创建角色 qq华夏角色交易
秒点QQ华夏图标方法分享无需进游戏无需创建角色——简介秒点QQ华夏图标方法,不需进游戏无需创建角色腾讯的最新BUG秒点QQ华夏图标方法分享无需进游戏无需创建角色——工具/原料电脑QQ浏览器(建议
怎么隐藏qq空间动态 怎么隐藏不了此条动态
怎么隐藏qq空间动态——简介 有的时候我们不想好友看到我们的空间动态,所以想将自己的空间动态隐藏掉,那如何隐藏空间的动态了,让好友看不到你空间的动态,那我就介绍下如何将自己的空间动态隐藏掉的方法哦,希望能对你们有所帮助的哦;怎么
百度贴吧怎么弄动态头像 贴吧动态头像怎么弄
百度贴吧怎么弄动态头像——简介和大家分享一下,百度贴吧弄动态头像的经验,希望对大家有用。百度贴吧怎么弄动态头像——工具/原料浏览器百度贴吧怎么弄动态头像——方法/步骤