shiro动态的菜单项加载
ChainDefinitionSectionMetaSource,本质就是对所有角色菜单遍历,即角色菜单的双重遍历,实现菜单和角色的对应关系
package com.houbank.incoming.web.shrio;
import com.alibaba.dubbo.config.annotation.Reference;
import com.houbank.basic.util.response.BaseResponse;
import com.houbank.incoming.api.FinancialSalesFuncFacade;
import com.houbank.incoming.api.FinancialSalesRoleFacade;
import com.houbank.incoming.model.condition.FinancialSalesRoleCondition;
import com.houbank.incoming.model.condition.FinancialSalesUserRoleCondition;
import com.houbank.incoming.model.domain.FinancialSalesFuncRole;
import com.houbank.incoming.model.domain.FinancialSalesRole;
import com.houbank.incoming.web.controller.FinancialSalesUserController;
import org.apache.shiro.config.Ini;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.*;
//import com.houbank.incoming.web.util.UserDetailsSessionService;
//import core.apps.rbac.login.UserDetailsSessionService;
public class ChainDefinitionSectionMetaSource implements FactoryBean<Ini.Section>{
private String filterChainDefinitions;
// @Autowired(required=false)
// private UserDetailsSessionService userDetailsSessionService;
// @Autowired(required=false)
// private DBKeyHelp dBKeyHelp;
//
// @Autowired(required=false)
// private DBServerHelp dBServerHelp;
//
@Autowired(required=false)
private RedisTemplate redisTemplate;
@Reference
private FinancialSalesFuncFacade financialSalesFuncFacade;
@Reference
private FinancialSalesRoleFacade financialSalesRoleFacade;
/**
* 默认premission字符串
*/
public static final String PREMISSION_STRING="perms[\"{0}\"]";
//泛型用类名加<>传入 ,构造参数用类名加()
public Ini.Section getObject() throws BeansException {
//获取所有Resource
Map<String,String> a = new HashMap<String,String>();
try {
//dBKeyHelp.getSerialNo("LC", "1010", "");
// dBServerHelp.getServerNo("10.100.84.38", "SUPT", "OD", "11");
// DBKeyHelpBo dBKeyHelpBo= new DBKeyHelpBo();
// dBKeyHelpBo.setIntypecode("OD");
// dBKeyHelpBo.setInbranchid("0000");
// dBKeyHelpBo.setsDateFmt("yy");
// dBKeyHelpBo.setsNoFmt("0000000000");//000000
// dBKeyHelpBo.setToday(new Date());
// dBKeyHelpBo.setNum(100);
// String serialNo= serialContext.getSerialNo(dBKeyHelpBo);
// DBServerHelpBo dBServerHelpBo= new DBServerHelpBo();
// dBServerHelpBo.setIpStr("10.100.84.38");
// dBServerHelpBo.setServerType("SUPT");
// dBServerHelpBo.setBussType("OD");
// dBServerHelpBo.setBatchSaveSize("11");
// dBServerHelpBo.setToday(new Date());
// dBServerHelpBo.setsDateFmt("yyMMddHHmmss");
// dBServerHelpBo.setsNoFmt("00000");
// dBServerHelpBo.setNum(100);
// String serverSerialNo= serialContext.getSerialNo(dBServerHelpBo);
// System.out.println("serialNo=="+serialNo+"======serverSerialNo===="+serverSerialNo);
// serialNo= serialContext.getSerialNo(dBKeyHelpBo);
// serverSerialNo= serialContext.getSerialNo(dBServerHelpBo);
// System.out.println("serialNo=="+serialNo+"======serverSerialNo===="+serverSerialNo);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// int n=0;
// RedisLock lock = new RedisLock(redisTemplate, "quarz_key", 10000, 20000);
// try {
// if(lock.lock()) {
// //需要加锁的代码
// n++;
// System.out.println("=========reirs======="+n);
// System.out.println("=========reirs======="+lock.getLockKey());
// System.out.println("=========reirs======="+lock.get("quarz_key_lock"));
//
// }
// }catch (InterruptedException e) {
// e.printStackTrace();
// }finally {
// lock.unlock();
// }
// financialSalesUserController.getweixinBaseInfoList();
return getSectionService(filterChainDefinitions) ;
}
public Ini.Section getSectionService(String filterChainDefinitions) {
List<FinancialSalesFuncRole> list =new ArrayList<FinancialSalesFuncRole>();
List<FinancialSalesFuncRole> listAll =new ArrayList<FinancialSalesFuncRole>();
// list=this.baseService.findAll(RoleSkillBTEntity.class);
FinancialSalesUserRoleCondition financialSalesRoleCondition =new FinancialSalesUserRoleCondition();
list = financialSalesRoleFacade.selectAll();
// String sql = "SELECT b.*,s.URL from s_rbac_roleskillb b ,s_rbac_skill s WHERE b.SKILLID=s.SKILLID";
List<Map> branchArr = financialSalesRoleFacade.getRoleFuncUrl(financialSalesRoleCondition);//this.baseService.queryForJDBCList(sql);
// SkillMenuEntity item = new SkillMenuEntity();
// List<SkillMenuEntity> items =this.baseService.findAll(SkillMenuEntity.class);
// SkillInfoEntity opmMenuitemlimit = new SkillInfoEntity();
// List<SkillInfoEntity> opmMenuitemlimits =this.baseService.findAll(SkillInfoEntity.class);//opmMenuitemlimitService.getOpmMenuitemlimit(opmMenuitemlimit);
// List<SkillMenuEntity> itemsb =new ArrayList<SkillMenuEntity>();
// List<SkillInfoEntity> opmMenuitemlimitsb =new ArrayList<SkillInfoEntity>();
Set<String> itms= new HashSet<String>();
Set<String> itmls= new HashSet<String>();
for (Iterator<Map> it1 = branchArr.iterator(); it1.hasNext();) {
Map resource = (Map)it1.next();////角色菜单信息
// if("1".equals(resource.get("validFlag"))){
itmls.add(resource.get("funcId")+"");
// }
}
// for(String im :itmls){//字符串转化为实体
// SkillInfoEntity o = new SkillInfoEntity();
// o.setSkillId(im);
// opmMenuitemlimitsb.add(o);
// }
Ini ini = new Ini();
ini.load(filterChainDefinitions);
Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
Map<String,Set<String>> mapr = new HashMap<String,Set<String>>();
Set<String> roleIds=null;
Set<String> mlroleIds=null;
if(list!=null&&list.size()>0){
//双重循环讲角色和对应的菜单对应
for(int i = 0; i < branchArr.size(); i++){//遍历角色菜单
Map r = (Map)branchArr.get(i);
roleIds=new HashSet<String>();
mlroleIds=new HashSet<String>();
for (Iterator<Map> it = branchArr.iterator(); it.hasNext();) {//遍历角色菜单
Map resource = it.next();
if(r.get("funcId").equals(resource.get("funcId"))){
//如果不为空值添加到section中
// if("1".equals(resource.get("validFlag"))) {
roleIds.add(resource.get("roleId")+"");
// }
}
}
if(!"".equals(r.get("url")) && null!=r.get("url")){
mapr.put(r.get("url")+"", roleIds);
}
}
}
StringBuffer au=null;
String st="";
//匹配到的转化为要求格式
for(Map.Entry<String, Set<String>> en:mapr.entrySet()){
au = new StringBuffer();
au.append("authc,role[");
for(String a :en.getValue()){
au.append("\""+a+"\",");
}
String strau=au.substring(0,au.lastIndexOf(","));
strau+="]";
st+=en.getKey()+">>>>"+strau+"\n";
// section.put(en.getKey()+"**",strau);
section.put(en.getKey(),strau);
}
System.out.println(st);
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;
}
public FinancialSalesFuncFacade getFinancialSalesFuncFacade() {
return financialSalesFuncFacade;
}
public void setFinancialSalesFuncFacade(FinancialSalesFuncFacade financialSalesFuncFacade) {
this.financialSalesFuncFacade = financialSalesFuncFacade;
}
public FinancialSalesRoleFacade getFinancialSalesRoleFacade() {
return financialSalesRoleFacade;
}
public void setFinancialSalesRoleFacade(FinancialSalesRoleFacade financialSalesRoleFacade) {
this.financialSalesRoleFacade = financialSalesRoleFacade;
}
}