Java安全框架——Apache Shiro(三十四)

102 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

4、动态过滤器链

在第十章中,我们加载过滤器链的方式

#静态资源不过滤
/static/=anon
#登录链接不过滤
/login/
=anon
#访问/resource/需要有admin的角色
#/resource/
=roleOr[MangerRole,SuperAdmin]
#/role/** =jwt-roles[SuperAdmin]
/resource/** =jwt-perms[role:listInitialize]
#其他链接是需要登录的
/**=kicked-out,jwt-authc

在统计鉴权系统中,我们不可能每次发布新的过滤器链,就去重启服务器,我们更希望可以动态管理过滤器链

【1】需求分析

实现动态过滤器链,我们需要保证以下几个特性:

1、持久化:原有的properties内容放入数据库,

2、有序性:因过滤器链有序加载的特性,读取过滤器链的时保证其有序性

3、服务化:过滤器链的服务做成dubbo服务,做到集中式管理

4、同步性:不同业务系统对于过滤器链的加载需要同步

5、热加载:过滤器链修改之后,各个业务系统不需要重启服务,以达到热加载的目的

【2】代码实现

【2.1】持久化、有序化

主要是对FilterChain类的CRUD这里就不做赘述,需要注意的是排序:升序排列,以保障过滤器链的有序加载

【2.2】服务化

服务化过滤器链加载

FilterChainFace:过滤器链桥接器dubbo接口层
FilterChainFaceImpl:过滤器链桥接器dubbo接口层实现

FilterChainFace接口

package com.itheima.shiro.face;  
  
import com.itheima.shiro.vo.FilterChainVo;  
  
import java.util.List;  
  
/**  
 * @Description:过滤器查询接口  
 */  
public interface FilterChainFace {  
  
    public List<FilterChainVo> findFilterChainList();  
}  
  

FilterChainFaceImpl

package com.itheima.shiro.faceImpl;  
  
import com.itheima.shiro.face.FilterChainFace;  
import com.itheima.shiro.pojo.FilterChain;  
import com.itheima.shiro.service.FilterChainService;  
import com.itheima.shiro.utils.BeanConv;  
import com.itheima.shiro.utils.EmptyUtil;  
import com.itheima.shiro.vo.FilterChainVo;  
import org.apache.dubbo.config.annotation.Service;  
import org.springframework.beans.factory.annotation.Autowired;  
  
import java.util.List;  
  
/**  
 * @Description:  
 */  
@Service(version = "1.0.0", retries = 3,timeout = 5000)  
public class FilterChainFaceImpl implements FilterChainFace {  
  
    @Autowired  
    FilterChainService filterChainService;  
  
    @Override  
    public List<FilterChainVo> findFilterChainList() {  
        List<FilterChain> filterChainList = filterChainService.findFilterChainList();  
        if (!EmptyUtil.isNullOrEmpty(filterChainList)){  
            return BeanConv.toBeanList(filterChainList, FilterChainVo.class);  
        }  
        return null;  
    }  
}  
  

这里只是简单的dubbo服务,也不做赘述