apache shiro - 动态创建filterchaindefinitions

[url]http://www.360doc.com/content/14/0207/13/834950_350425926.shtml[/url]

有时,在某些系统想通过读取数据库来定义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")
public class Resource implements Serializable {
//主键id
@Id
private String id;
//action url
private String value;
//shiro permission;
private String permission;
//------------------Getter/Setter---------------------//
}


@Repository
public class ResourceDao extends BasicHibernateDao<Resource, String> {

}


通过该类可以知道permission字段和value就是filterChainDefinitionMap的键/值,用spring FactoryBean接口的实现getObject()返回Section给filterChainDefinitionMap即可
public class ChainDefinitionSectionMetaSource implements FactoryBean<Ini.Section>{

@Autowired
private ResourceDao resourceDao;

private String filterChainDefinitions;

/**
* 默认premission字符串
*/
public static final String PREMISSION_STRING="perms[\"{0}\"]";


public Section getObject() throws BeansException {

//获取所有Resource
List list = resourceDao.getAll();

Ini ini = new Ini();
//加载默认的url
ini.load(filterChainDefinitions);
Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
//循环Resource的url,逐个添加到section中。section就是filterChainDefinitionMap,
//里面的键就是链接URL,值就是存在什么条件才能访问该链接
for (Iterator it = list.iterator(); it.hasNext();) {

Resource resource = it.next();
//如果不为空值添加到section中
if(StringUtils.isNotEmpty(resource.getValue()) && StringUtils.isNotEmpty(resource.getPermission())) {
section.put(resource.getValue(), MessageFormat.format(PREMISSION_STRING,resource.getPermission()));
}

}

return section;
}

/**
* 通过filterChainDefinitions对默认的url过滤定义
*
* @param filterChainDefinitions 默认的url过滤定义
*/
public void setFilterChainDefinitions(String filterChainDefinitions) {
this.filterChainDefinitions = filterChainDefinitions;
}



public Class> getObjectType() {
return this.getClass();
}



public boolean isSingleton() {
return false;
}

}


定义好了chainDefinitionSectionMetaSource后修改applicationContext-shiro.xml文件


<bean id="chainDefinitionSectionMetaSource" class="org.exitsoft.showcase.vcsadmin.service.account.ChainDefinitionSectionMetaSource">

<property name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/resource/** = anon
</value>
</property>
</bean>


<bean id="shiroSecurityFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login.jsp" />
<property name="successUrl" value="/index.jsp" />
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- shiro连接约束配置,在这里使用自定义的动态获取资源类 --&gt
<property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
</bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
### 关于Apache Shiro 550反序列化漏洞详情 对于Apache Shiro存在的反序列化漏洞,具体到CVE编号为CVE-2016-4437而非CVE-2022-42889。此漏洞存在于Apache Shiro<=1.2.4版本中,在返回包的Set-Cookie中存在`rememberMe=deleteMe`字段可以作为识别该漏洞的一个标志[^1]。 当应用程序使用了不安全的方式处理rememberMe功能时,攻击者可以通过构造恶意输入来触发Java对象的反序列化过程,从而执行任意代码。这一特性使得攻击者能够在服务器端运行未经许可的操作,造成严重的安全隐患[^3]。 为了检测是否存在上述提到的安全风险,可借助专门开发出来的工具如ShiroExploit来进行测试;这些工具能够帮助确认目标环境是否容易受到此类攻击的影响,并提供相应的证据支持[^4]。 ### 修复措施建议 针对已知的Apache Shiro反序列化漏洞(CVE-2016-4437),官方推荐升级至更高版本以获得最新的安全性改进和支持。除了及时更新软件外,还应采取其他预防性策略: - **禁用Remember Me功能**:如果业务逻辑允许的话,考虑完全关闭记住我的选项。 - **加强依赖库管理**:定期审查项目所使用的第三方组件及其版本号,确保它们都是最新且经过充分审计的状态。 - **实施严格的输入验证机制**:无论是来自客户端还是内部服务之间的通信数据都应该被仔细过滤和校验,防止潜在危险载荷进入系统核心区域。 ```bash # 更新Shiro到最新稳定版 mvn install:install-file -Dfile=/path/to/apache-shiro-core-latest.jar \ -DgroupId=org.apache.shiro \ -Dversion=<new_version> \ -Dpackaging=jar ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值