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

93 阅读1分钟

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

【2.3】同步性

定义启动加载过滤器链服务同步:

FilterChainBridgeService:过滤器链桥接器service接口层
FilterChainBridgeServiceImpl:过滤器链桥接器service接口层实现

ShiroFilerChainService:shiro过滤器链服务加载接口
ShiroFilerChainService:shiro过滤器链服务加载接口实现

FilterChainBridgeService

package com.itheima.shiro.core.bridge;  
  
import com.itheima.shiro.vo.FilterChainVo;  
  
import java.lang.reflect.InvocationTargetException;  
import java.util.List;  
  
/**  
 * @Description 过滤器链service接口层  
 */  
public interface FilterChainBridgeService {  
  
    /**  
     * @Description 查询所有有效的过滤器链  
     * @return  
     */  
    List<FilterChainVo> findFilterChainList();  
  
  
  
}  

FilterChainBridgeServiceImpl

package com.itheima.shiro.client;  
  
import com.itheima.shiro.core.bridge.FilterChainBridgeService;  
import com.itheima.shiro.face.FilterChainFace;  
import com.itheima.shiro.vo.FilterChainVo;  
import org.apache.dubbo.config.annotation.Reference;  
import org.springframework.stereotype.Component;  
  
import java.util.List;  
  
/**  
 * @Description:  
 */  
@Component("filterChainBridgeService")  
public class FilterChainBridgeServiceImpl implements FilterChainBridgeService {  
  
    @Reference(version = "1.0.0")  
    private FilterChainFace filterChainFace;  
  
    @Override  
    public List<FilterChainVo> findFilterChainList() {  
  
        return filterChainFace.findFilterChainList();  
    }  
}  
  

ShiroFilerChainService过滤器链同步接口

package com.itheima.shiro.service;

import com.itheima.shiro.vo.FilterChainVo;

import javax.annotation.PostConstruct;
import java.util.List;

/**
* @Description:过滤器链同步接口
*/
public interface ShiroFilerChainService {

    /**
* @Description 启动时加载数据库中的过滤器链
*/
void init();

    /**
* @Description 初始化过滤器链
* @param
* @return
*/
void initFilterChains(List FilterChainVos);
}

ShiroFilerChainServiceImpl过滤器链同步接口实现

package com.itheima.shiro.service.impl;

import com.itheima.shiro.core.impl.CustomDefaultFilterChainManager;
import com.itheima.shiro.service.ShiroFilerChainService;
import com.itheima.shiro.core.bridge.FilterChainBridgeService;
import com.itheima.shiro.vo.FilterChainVo;
import lombok.extern.log4j.Log4j2;
import org.apache.shiro.web.filter.mgt.DefaultFilterChainManager;
import org.apache.shiro.web.filter.mgt.NamedFilterList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
* @Description:过滤器链同步接口实现
*/
@Service("shiroFilerChainManager")
@Log4j2
public class ShiroFilerChainServiceImpl implements ShiroFilerChainService {

    //此时注入的为CustomDefaultFilterChainManager
@Autowired
private CustomDefaultFilterChainManager filterChainManager;

    @Autowired
FilterChainBridgeService filterChainBridgeService;

    private Map<String, NamedFilterList> defaultFilterChains;

    private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

    /**
* @Description 启动定时器,间隔2分钟同步数据库的过滤器链
*/
@Override
@PostConstruct
public void init() {
defaultFilterChains = new LinkedHashMap<>();
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
initFilterChains(filterChainBridgeService.findFilterChainList());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}, 0, 120, TimeUnit.SECONDS);

    }

    @Override
public void initFilterChains(List FilterChainVos) {

        //1、首先删除以前老的filter chain并注册默认的
filterChainManager.getFilterChains().clear();

        //2、循环URL Filter 注册filter chain
for (FilterChainVo urlFilterVo : FilterChainVos) {
String url = urlFilterVo.getUrl();
String filterName = urlFilterVo.getFilterName();
String[] filterNames = filterName.split(",");
for (String name : filterNames) {
//注册所有filter,包含自定义的过滤器
switch(name){
case "anon":
filterChainManager.addToChain(url, name);
break;
case "authc":
filterChainManager.addToChain(url, name);
break;
case "roles":
filterChainManager.addToChain(url, name, urlFilterVo.getRoles());
break;
case "perms":
filterChainManager.addToChain(url, name,urlFilterVo.getPermissions());
break;
case "role-or":
filterChainManager.addToChain(url, name,urlFilterVo.getRoles());
break;
case "kicked-out":
filterChainManager.addToChain(url, name);
break;
case "jwt-authc":
filterChainManager.addToChain(url, name);
break;
case "jwt-roles":
filterChainManager.addToChain(url, name, urlFilterVo.getRoles());
break;
case "jwt-perms":
filterChainManager.addToChain(url, name,urlFilterVo.getPermissions());
break;
default:
break;
}
}
}
}
}