apache shiro - 动态创建filterchaindefinitions shiro userfilter

有时,在某些系统想通过读取数据库来定义org.apache.shiro.spring.web.ShiroFilterFactoryBean的filterChainDefinitions。这样能够通过操作界面或者维护后台来管理系统的链接。

在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()));

}

}
apache shiro - 动态创建filterchaindefinitions shiro userfilter

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连接约束配置,在这里使用自定义的动态获取资源类--&gt

<propertyname="filterChainDefinitionMap"ref="chainDefinitionSectionMetaSource"/>

</bean>

<beanid="securityManager">

</bean>

<beanid="lifecycleBeanPostProcessor"/>

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/111417.html

更多阅读

ppt演示文稿教程:1 如何创建ppt文稿

ppt演示文稿教程:[1]如何创建ppt文稿——简介powerpoint2010的基本操作将介绍多种创建ppt文稿的方法,初步掌握ppt文稿的制作和编辑技术,学会用多种视图方式浏览演示文稿。ppt演示文稿教程:[1]如何创建ppt文稿——工具/原料PowerPoint 2

如何在unity3d中创建天空 unity3d 天空盒子

如何在unity3d中创建天空——简介我们玩各种各样的网络游戏,都会给人一种感觉,那就是觉得这个游戏世界似乎很大、很宽广。这里主要是因为天空盒的原因。有了天空盒,会突然让玩家觉得,这个游戏世界很美,很大。这里简单介绍一下如何在unity

怎么隐藏qq空间动态 怎么隐藏不了此条动态

怎么隐藏qq空间动态——简介 有的时候我们不想好友看到我们的空间动态,所以想将自己的空间动态隐藏掉,那如何隐藏空间的动态了,让好友看不到你空间的动态,那我就介绍下如何将自己的空间动态隐藏掉的方法哦,希望能对你们有所帮助的哦;怎么

百度贴吧怎么弄动态头像 贴吧动态头像怎么弄

百度贴吧怎么弄动态头像——简介和大家分享一下,百度贴吧弄动态头像的经验,希望对大家有用。百度贴吧怎么弄动态头像——工具/原料浏览器百度贴吧怎么弄动态头像——方法/步骤

声明:《apache shiro - 动态创建filterchaindefinitions shiro userfilter》为网友荒人说梦分享!如侵犯到您的合法权益请联系我们删除