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;
}
}
相关推荐
- 在后端根据用户角色或权限信息,过滤掉用户无权访问的菜单项。 - 前端也可以做权限校验,但主要的安全控制应放在服务器端,防止跨站脚本攻击(XSS)。 6. 动态加载: - 为了提高页面加载速度,可以采用按需...
4. **菜单管理**:构建系统的导航结构,根据用户角色展示不同的菜单项。 5. **日志管理**:记录用户的操作日志,便于追踪和审计。 **系统实现** 1. **Shiro集成**:配置Shiro的Realm,实现用户认证和权限校验。 2. ...
JavaEE动态菜单是一种在Web应用中常见的功能设计,它允许用户根据权限和需求看到不同的菜单项,提高了用户体验并增强了系统的可扩展性和安全性。在JavaEE平台上实现动态菜单,通常涉及以下关键技术点: 1. **MVC...
Ztree是一款基于JavaScript的树控件,能够方便地实现动态加载数据、拖拽等操作,非常适合用于权限管理、目录展示等功能模块中。在Java Web项目中,尤其是使用了Shiro框架的项目里,Ztree的应用十分广泛。 #### 二、...
在加载菜单时,系统会查询数据库以确定用户角色所拥有的菜单权限,并只显示相应的菜单项。这样,用户只能看到并访问与其角色匹配的菜单功能。 总之,C#环境下的菜单与权限控制涉及用户角色分配、权限配置、权限管理...
在本项目中,Thymeleaf负责展示用户界面,根据用户角色和权限动态加载不同的菜单项。 5. **用户管理**:项目中包含了用户管理模块,包括用户的注册、登录、密码重置、权限分配等功能。这些功能的实现依赖于Shiro的...
3. **动态菜单生成**:StrutsMenu的核心功能是动态生成菜单,这包括根据用户权限动态隐藏或显示菜单项,以及根据菜单层级结构进行嵌套显示。它通常会有一个自定义的Tag库,用于在JSP页面中方便地插入和渲染菜单。 4...
菜单与权限的关联使得系统能够根据用户的角色自动过滤出其有权访问的菜单项。 角色管理是权限分配的核心。角色是一组权限的集合,可以理解为一种预定义的权限模板。管理员可以通过角色将权限批量分配给用户,这样...
它可以实现动态加载,根据用户的权限显示相应的菜单项。通常,菜单结构会被设计成树形结构,便于层次化展示。菜单与权限管理紧密关联,用户看到的菜单由其角色所拥有的权限决定。这部分可能涉及到前端的路由配置,...
例如,一个普通的员工可能只能看到与其工作相关的菜单项,而高级管理者则可以看到更多的系统设置和管理选项。这种灵活性使得系统能够适应多变的业务场景。 国际化(i18n)是现代软件系统的一个重要特征,尤其是在...
4. 资源表(resource):包含系统中的所有资源,如菜单项、子菜单和按钮等。 5. 角色资源关联表(role_resource):表示角色可以访问哪些资源,实现角色与资源的绑定。 在后台实现上,这里采用了Spring MVC作为MVC框架...