信息系统按钮权限控制

按钮类型:增、删、改、查、导出、导出、流程查看、流程跟踪

 

菜单:menu1、menu2

 

权限组:哪个组有哪些菜单的按钮权限


1、根据菜单编号和操作按钮编号数组([add,del,search,update] 等),返回数组中的每个操作是否有权限true或false

2、根据true或false直接显示或隐藏按钮;

 

**********************************common.js**********************************Start

/**
 * 一次处理所有的按钮权限,节省请求次数,减轻负载压力;
 * @param optArr 按钮数组
 * @param menuId 菜单编号
 * @returns {json}
 */
function hasPrivsForAllBtn(optArr, menuId) {
    var allBtnPrivsJson={};
    //1 如果没有传入menuId,取一下
    if(!menuId)
        //menuId = top.document.getElementById('top').name;
        menuId = top.document.getElementById('currMenuId').value;
        
    //2 如果menuId 有值,去匹配当前登录人时候有对应按钮权限
    if(optArr && menuId) {
        //ajax 判断当前登录用户是否具有该按钮的权限
        $.ajax({
            method : 'post',
            url : 'Privs_hasPrivsForAllBtn.do',
            data:{"optArr":optArr,"menuId":menuId},
            dataType : 'JSON',
            traditional: true,//在struts2下该属性必须有
            async : true,//异步;同步会导致请求阻塞。zhangyouxue 2015-04-08
            success : function(result) {
                for(var i=0; i<optArr.length; i++) {
                    if(allBtnPrivsJson[optArr[i]]) {
                        //没有权限则隐藏掉按钮
                        $("div[data-options='"+ optArr[i] +"']").attr('style', 'display:none;');
                    }else {
                        $("div[data-options='"+ optArr[i] +"']").attr('style', '');
                    }
                }
            }
        });
    }
    return allBtnPrivsJson;
}


**********************************common.js**********************************End

**********************************PrivsAction.java**********************************Start

    private String[] optArr;
    
    public String[] getOptArr() {
        return optArr;
    }
    public void setOptArr(String[] optArr) {
        this.optArr = optArr;
    }


    /**
     * 对hasPrivs优化,对处理多合一。
     * @return
     * @throws IOException
     */
    public String hasPrivsForAllBtn() throws IOException {
        String menuId = request.getParameter("menuId");
        DhccUser loginUser = (DhccUser)request.getSession().getAttribute("loginUser");
        //StringBuilder allBtnPrivsJson = new StringBuilder();
        Map<String,String> jsonMap = new HashMap<String,String>();
        for (String opt : optArr) {
            if(loginUser!=null && menuId!=null && !menuId.equals("") && opt!=null && !opt.equals("")) {
                if(loginUser.isSysAdmin() || loginUser.hasPrivs(opt+"_"+menuId)){
                    jsonMap.put(opt,"true");
                }else{
                    jsonMap.put(opt,"false");
                }
            }
        }
        
        //allBtnPrivsJson.append(JsonUtil.toJSONStringByFastjson(jsonMap));
        PrintWriter out = response.getWriter();
        out.write(JsonUtil.toJSONStringByFastjson(jsonMap));
        out.flush();
        out.close();
        
        return null;
    }


 **********************************PrivsAction.java**********************************End

**********************************DhccUser.java********************************** Start

是否系统管理员,在系统登录时认证,存到session中。

public boolean isSysAdmin() {
  boolean rtn = false;
  if(iuser.getKeyName().equalsIgnoreCase("administrator"))
   rtn = true;
  return rtn;
 }

 //判断该用户是否具有指定菜单的权限
 public boolean hasPrivs(String menuId) {
  /*1 如果该菜单不存在,则默认具有该菜单权限(主要是为了处理按钮级别的权限控制,例如某个功能点不需要判断其CRUD的权限,可能在sysmenu中就没有定义,这时候默认其具有该权限)*/
  if(MenuUtils.getAllMenuMap().get(menuId) == null)
   return true;
  else if(menuId!=null && !menuId.equals("") && privsMap.get(menuId)!=null)
   return true;
  else
   return false;
 }

 **********************************DhccUser.java**********************************End

**********************************MenuUtils.java**********************************Start

   /**
     *  获得顶级菜单
     *  可以再根据菜单的getSons方法逐级获取下级菜单
     * @Descrption
     * @return
     * @Version 1.0
     * @Author ***
     * @Date Sep 6, 2012
     */
    public static List<Menu> getRootMenus() {
        if(root_menus==null)
            root_menus = XmlUtils.xml2Menus();
        return root_menus;
    }

 /**
  * 获得map格式的所有菜单
  * @Descrption
  * @return
  * @Version 1.0
  * @Author ***
  * @Date Feb 4, 2013
  */

private static Map<String, Menu> all_menus_map = null;

 public static Map<String, Menu> getAllMenuMap() {
  if(all_menus_map == null) {
   //保存到map中
   all_menus_map = new HashMap<String, Menu>();
   all_menus = getAllMenus();
   for(int i=0; i<all_menus.size(); i++) {
    all_menus_map.put(all_menus.get(i).getId(), all_menus.get(i));
   }
  }
  return all_menus_map;
 }


/**
  * 获得所有菜单
  * @Descrption
  * @return
  * @Version 1.0
  * @Author ***
  * @Date Sep 6, 2012
  */
 public static List<Menu> getAllMenus() {
  if(all_menus==null) {
   all_menus = new ArrayList<Menu>();
   root_menus = getRootMenus();
   for(Menu m : root_menus) {
    all_menus.add(m);
    getAllMenus(m);
   }
   //过滤一下null
   all_menus.remove(null);
  }
  return all_menus;
 }

/*

获得所有菜单项

*/

 private static void getAllMenus(Menu me) {
  for(Menu m : me.getSons()) {
   all_menus.add(m);
   getAllMenus(m);
  }
 }



/**
     * 重新加载菜单,用于解决菜单文件更新后需要重启服务器的问题
     * @Descrption
     * @Version 1.0
     * @Author ***
     * @Date Sep 6, 2012
     */
    public static void initMenus() {
        root_menus = null;
        all_menus = null;
        getRootMenus();
        getAllMenus();
    }


**********************************MenuUtils.java**********************************End

**********************************XmlUtils.java**********************************Start

  

 /**
     * //返回的是一个三层map(用于解析导出excel 定义的数据转换文件)
     *    //    1 最外层的key,是所有的类                 -->bean_map
     *    //    2 中间层的key,是一个类所有的属性            -->prop_map
     *    //    3 最里层的key,一个属性所有的转换集合        -->format_map
     * @Descrption
     * @return
     * @Version 1.0
     * @Author ***
     * @Date Sep 5, 2012
     */
    public static Map<String, Map<String, Map<String, String>>> xml2Map() {
        SAXReader reader = new SAXReader();  
        Document doc;
        File file = new File(XmlUtils.class.getClassLoader().getResource("format.xml").getPath());//这里执行配置文件的地址,放在src下
        try {
            doc = reader.read(file);
        } catch (DocumentException e) {
            e.printStackTrace();
            return xml2Map(null);
        }
        return xml2Map(doc);
    }
    private static Map<String, Map<String, Map<String, String>>> xml2Map(Document doc) {
        //返回的是一个三层map
        //    1 最外层的key,是所有的类                 -->bean_map
        //    2 中间层的key,是一个类所有的属性            -->prop_map
        //    3 最里层的key,一个属性所有的转换集合        -->format_map
        
        Map<String, Map<String, Map<String, String>>> bean_map = new HashMap<String, Map<String, Map<String, String>>>();
        if (doc == null)
            return bean_map;
        Element root = doc.getRootElement();
        List<Element> beans = root.elements("bean");
        for(Element bean : beans) {
            Map<String, Map<String, String>> prop_map = new HashMap<String, Map<String, String>>();
            List<Element> props = bean.elements("prop");
            for(Element prop : props) {
                Map<String, String> format_map = new HashMap<String, String>();
                List<Element> formats = prop.elements("format");
                for(Element format : formats) {
                    format_map.put(format.attributeValue("key"), format.attributeValue("value"));
                }
                prop_map.put(prop.attributeValue("name"), format_map);
            }
            bean_map.put(bean.attributeValue("name"), prop_map);
        }
        
        return bean_map;
    }
    
    
    /**
     * 获取菜单文件
     *         这种方式支持无限下级
     * @Descrption
     * @param args
     * @throws URISyntaxException
     * @throws DocumentException
     * @throws DocumentException
     * @Version 1.0
     * @Author ***
     * @Date Sep 6, 2012
     */
    public static  List<Menu> xml2Menus() {
        SAXReader reader = new SAXReader();
        File file = new File("");
        try {
            file = new File(XmlUtils.class.getClassLoader().getResource("sysmenus.xml").toURI().getPath());
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }
        
        //这里执行配置文件的地址,放在src下
        Document doc = null;
        try {
            doc = reader.read(file);
        } catch (DocumentException e) {
            e.printStackTrace();
            return null;
        }
        Element root = doc.getRootElement();

        return getSons(root, 1, null);
    }
    //递归获取下级
    private static List<Menu> getSons(Element e, int level, Menu father) {
        List<Menu> menus = new ArrayList<Menu>();
        List<Element> elements = e.elements();
        if(elements==null || elements.size()<1)
            return menus;
        for(Element ele : elements) {
            String id = ele.attributeValue("id");
            String name = ele.attributeValue("name");
            String type = ele.attributeValue("type");
            String url = ele.attributeValue("url");
            String icon = ele.attributeValue("icon");
            if(type==null || type.equals(""))//type 默认为link
                type = "link";
            //Menu m = new Menu(id, name, type, url, level, father);
            Menu m = new Menu(id, name, type, url, icon, level, father);
            m.setSons(getSons(ele, level+1, m));
            menus.add(m);
        }
        return menus;
    }


**********************************XmlUtils.java**********************************End

**********************************sysmenus.xml**********************************Start

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--
    注意:
    1、 多个参数的连接符号在xml中用   & 表示
    2、 id  必须是唯一的,id不要随便更改,很多都是在程序中直接用到了,尤其是带字幕前缀的id
-->
<menus>
    <menu id="04" name="个人办公" url="" icon="dhcc02.png">
        <menu id="0400" name="文件柜" url="">
            <menu id="040001" name="公共文件柜" url="office/filecabinet/list.jsp?isPublic=Y"></menu>
            <menu id="040002" name="个人文件柜" url="office/filecabinet/list.jsp?isPublic=N"></menu>
        </menu>
        <menu id="0401" name="通讯录" url="">
            <menu id="040103" name="公共通讯录" url="addressbook/list.jsp?type=1">
                <menu id="a_040103" name="新建" type="button" />
                <menu id="q_040103" name="查看" type="button" />
                <menu id="d_040103" name="删除" type="button" />
                <menu id="u_040103" name="修改" type="button" />
                <menu id="e_040103" name="导出" type="button" />
            </menu>
        </menu>
        <menu id="0405" name="个人考勤" url="">
            <menu id="040501" name="签到/签退登记" url="SignInfoManage_toSignInfoUpdate.do"></menu>
        </menu>
    </menu>
</menus>


**********************************sysmenus.xml**********************************End

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值