论坛首页 Java企业应用论坛

树形菜单的权限控制是个蛋疼的问题【讨论】

浏览 16155 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-17  
kjj 写道

//大概应该是这样,当每个节点展开时,
List<TreeNode> getTreeNode(){
   Collection<Authrition> currentAuths = getCurrentAuths();
   String sql = "from TreeNode t where t.permission in (:perms)";
   Query q = ..;
   q.setParameterList("perms",currentAuths );
   return q.list():
}


Is this good!!!



没大看懂啊,能详细说下思路么?你这样查出来的只是有权限的节点吧,它的父节点怎么确定?
0 请登录后投票
   发表时间:2011-10-18  
使用ext树根据角色进行权限分配
	/**
	 * 获取角色权限菜单,进行权限分配,已经具有的权限,则勾选,不具有的则不勾选
	 * @throws Exception 
	 */
	public void listRoleAudit() throws Exception{
		 String roleId = request().getParameter("roleId");
		 List<Menu> allMenuList= sysService.getAllMenuListByParentId("01");
		 Role role =(Role)this.baseService.get(Role.class, Integer.parseInt(roleId));
		 Set<Menu> roleMenus = role.getMenus();
		 Map<String,String> judgeMap = new HashMap<String,String>();//存储当前角色的菜单权限的id,存放在map
		 for(Menu menu:roleMenus){
			 judgeMap.put(menu.getId(), menu.getId());
		 }
		 
		 List<ExtTreeNode> allMenus= new ArrayList<ExtTreeNode>();
		 for(Menu menu:allMenuList){
			 if(menu.getLeaf()==0){
				 ExtTreeNode parentNode= new ExtTreeNode();
				 List<ExtTreeNode> childList = new ArrayList<ExtTreeNode>();
				 parentNode.setId(menu.getId());
				 parentNode.setText(menu.getResourcename());
				 parentNode.setExpanded(true);
				 if(menu.getIcon()!=null&&!menu.getIcon().equals("")){
				 parentNode.setIcon(request().getContextPath()+"/"+menu.getIcon());
				 }
				 if(judgeMap.containsKey(menu.getId())){
					 parentNode.setChecked("checked");
					
				 }
				 
				 for(Menu menu1:allMenuList){
					 if(menu1.getParentid().equals(menu.getId())){
						 ExtTreeNode childNode= new ExtTreeNode();
						 childNode.setId(menu1.getId());
						 childNode.setText(menu1.getResourcename());
						 if(judgeMap.containsKey(menu1.getId())){
							 childNode.setChecked("true");
							 
						 }
						 childNode.setLeaf(true);
						 if(menu1.getIcon()!=null&&!menu1.getIcon().equals("")){
						 childNode.setIcon(request().getContextPath()+"/"+menu1.getIcon());
						 }
						 childList.add(childNode);
					 }
				 }
				 parentNode.setChildren(childList);
				 allMenus.add(parentNode);
			 }
		 }
		 String json= JsonUtils.convertToString(allMenus);
		 writeToPage(json);
	}
0 请登录后投票
   发表时间:2011-10-18  
不知道你们的权限是不是很灵活,如果不是特别灵活的话,可以使用鉴权位,在任意一个节点上面附加一个鉴权码,然后在发送给前台的时候过滤一遍所有的节点,如果该节点的鉴权码小于用户的权限码就显示,否则就去掉就可以了。这样的话还可以继续使用缓存,当然记得在每次对当前用户生成菜单之后也缓存一下,以后再从session里面获取就没这么复杂了。
0 请登录后投票
   发表时间:2011-10-18  
oracle可以用connnect by语句
0 请登录后投票
   发表时间:2011-10-18  
我了个去,
一个关联表就直接搞定了,还弄这么复杂..
0 请登录后投票
   发表时间:2011-10-18  
可执行 写道
kjj 写道

//大概应该是这样,当每个节点展开时,
List<TreeNode> getTreeNode(TreeNode parent){
   Collection<Authrition> currentAuths = getCurrentAuths();
   String sql = "from TreeNode t where t.parent=:parent and  t.permission in (:perms)";
   Query q = ..;
   q.setParameterList("perms",currentAuths );
   [b]q.setParameter("parent",parent);[/b]
   return q.list():
}


Is this good!!!



没大看懂啊,能详细说下思路么?你这样查出来的只是有权限的节点吧,它的父节点怎么确定?

点击每个父节点,查处所有有权限的节点,不用解释了吧
Is those good!!
0 请登录后投票
   发表时间:2011-10-18  
kjj 写道
可执行 写道
kjj 写道

//大概应该是这样,当每个节点展开时,
List<TreeNode> getTreeNode(TreeNode parent){
   Collection<Authrition> currentAuths = getCurrentAuths();
   String sql = "from TreeNode t where t.parent=:parent and  t.permission in (:perms)";
   Query q = ..;
   q.setParameterList("perms",currentAuths );
   [b]q.setParameter("parent",parent);[/b]
   return q.list():
}


Is this good!!!



没大看懂啊,能详细说下思路么?你这样查出来的只是有权限的节点吧,它的父节点怎么确定?

点击每个父节点,查处所有有权限的节点,不用解释了吧
Is those good!!


如果父节点不知道用户有没有权限但是其下面的某个子节点用户是有权限的,这个该怎么办?很可能子节点很深的。。
0 请登录后投票
   发表时间:2011-10-18   最后修改:2011-10-18
顺序反过来

使用jquery对某节点之下的所有节点的onclick事件进行取消
0 请登录后投票
   发表时间:2011-10-18  
引用

如果父节点不知道用户有没有权限但是其下面的某个子节点用户是有权限的,这个该怎么办?很可能子节点很深的。。

权限不是父节点控制的,是由authority控制得
Collection<Authrition> currentAuths = getCurrentAuths();   


0 请登录后投票
   发表时间:2011-10-18  
不可以用那什么RABC权限模型吗
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics