论坛首页 Java版 Struts

Struts-Menu结合角色权限的应用

浏览 7379 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2006-10-26
在前一个项目当中要根据登入用户的权限进行菜单显示:我把其中相关的代码提炼出来.
在系统启动时把菜单信息加载近来.通过扩展ActionServlet进行加载.
	/** 
	 *加载菜单静态信息
	 */
	private void loadMenuRepository()
	{
	     MenuConstructor menuConstructor=new MenuConstructor();
              menuConstructor.createMenuRepository();
	}

数据库表中一级菜单的roles值按2.4.8.16....增加 这样与用户的roles值进行位运算.只要值为1,就可以显示该菜单.
	/**
	 * 加载系统菜单入菜单库
	 * @param defaultRepository	:缺省库
	 */
	public void createMenuRepository() 
	{
		ServletContext app=ApplicationContext.getContext();
        MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
		MenuRepository repository = new MenuRepository();
        repository.setDisplayers(defaultRepository.getDisplayers());
        List list = getMenuComponents();
        for (int i=0; i < list.size(); i++) 
        {
            MenuComponent mc = new MenuComponent();
            MenuInfo menu=(MenuInfo) list.get(i);
            String menuName = menu.getName();
            mc.setName(menuName);
            String parentName = (String) menu.getParentName();
            if (parentName != null) 
            {
                MenuComponent parentMenu = repository.getMenu(parentName);
                if (parentMenu == null) 
                {
                    parentMenu = new MenuComponent();
                    parentMenu.setName(parentName);
                    repository.addMenu(parentMenu);
                }
                mc.setParent(parentMenu);
            }
            String title = (String)menu.getTitle();
            String location = (String) menu.getLocation();
            String target = (String) menu.getTarget();
            String description = (String) menu.getDescription();
            String action=(String)menu.getAction();
            String roles=(String)menu.getRoles();
            mc.setTitle(title);                        
            mc.setLocation(location);
            mc.setAction(action);
            mc.setTarget(target);            
            mc.setDescription(description);
            mc.setRoles(roles);
            repository.addMenu(mc);
        }
        constant.setMenuRepository(repository);
        //因为加载出来的菜单信息被打乱了.
        //按照库表菜单顺序保存一级菜单信息,在struts-menu显示时要用
        app.setAttribute("OrderMenuList",getOrderMenuList());
	}
	
	/**
	 * 从数据库中读取菜单信息
	 * @return List	:菜单信息
	 */
    private static List getMenuComponents() 
    {
		PersistenceService service = (PersistenceService)ApplicationContextProvider.getBean("persistenceService");
        String hql=QlConstructor.getSqlContent("getMenuInfo");
		List menuInfoList = service.list(hql);
		return menuInfoList;
    }
    
    /**
     * 将菜单表中的一级菜单按照显示顺序取出来
     * @return List:一级菜单信息
     */
    private static List getOrderMenuList()
    {
        List orderMenuList=new ArrayList();
        PersistenceService service = (PersistenceService)ApplicationContextProvider.getBean("persistenceService");
        String hql=QlConstructor.getSqlContent("getParentmenuSql");
        orderMenuList = service.list(hql);
        return orderMenuList;
    }


	/**
	 * 根据userId获取用户所能看到的菜单信息
	 * @param   authSet			:用户权限集
	 * @return	MenuRepository	: 用户所能看到的菜单库
	 */
	public MenuRepository getUserMenuRepository(long authSet) 
	{
		Constant constant=Constant.getInstance();
		//获取系统所有菜单
		ServletContext app=ApplicationContext.getContext();
		MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
		MenuRepository menuRepository=constant.getMenuRepository();
		MenuRepository userMenuRepository=new MenuRepository();
		userMenuRepository.setDisplayers(defaultRepository.getDisplayers());
		Set menuSet=menuRepository.getMenuNames();
		Iterator itor=menuSet.iterator();
		MenuComponent menuComponent =null;
		//查找满足用户权限的菜单项
		while(itor.hasNext())
		{
			String menuName=(String)itor.next();
			menuComponent = menuRepository.getMenu(menuName);
			long roles=Long.parseLong(menuComponent.getRoles());
			if((roles&authSet)!=0)
			{
				userMenuRepository.addMenu(menuComponent);				
			}
		}
		//TODO:下面生成用户所能看到的菜单
	    userMenuRepository=menuRepository;
		return userMenuRepository;
	}
	
    /**
     * 获取用户所能看到的一级菜单列表,在画面展示时struts-menu标签需要用到
     * @param userMenuRepository    :用户自己的菜单库
     * @return  List: 用户能看到的一级菜单名称数组
     */
	public List getParentMenuNameList(MenuRepository userMenuRepository) throws Exception
	{        
        ServletContext app=ApplicationContext.getContext();
        List orderMenuList=(List)app.getAttribute("OrderMenuList");
        List parentMenuNameList=new ArrayList();
        for(int i=0;i<orderMenuList.size();i++)
        {
            String menuName=((MenuInfo)orderMenuList.get(i)).getName();
            if(userMenuRepository.getMenu(menuName)!=null)  parentMenuNameList.add(menuName);
        }       
		return parentMenuNameList;
	}

显示菜单:
	<menu:useMenuDisplayer name="Velocity" config="/framework/res/menucomp/templates/xtree.html"  bundle="org.apache.struts.action.MESSAGE" repository="userMenuRepository"  permissions="menuPermession">
		<logic:iterate id="menuName" name="userParentMenuNameList" indexId="index">
			<menu:displayMenu name='<%=menuName.toString()%>' />
		</logic:iterate>   	
	</menu:useMenuDisplayer>
   
最后更新时间:2007-01-15
代码贴出来吧,看的好累
   
0 请登录后投票
最后更新时间:2007-01-15
把实现效果和实现代码贴出来给大家参考一下,包括数据表,这样看上去太累了啊
   
0 请登录后投票
最后更新时间:2007-05-10
有完整的没有,按照你的代码不行呀。
   
0 请登录后投票
最后更新时间:2007-05-10
这样的权限系统不通用,且过于简单
第一,不要基于structs,要基于JSP规范才能更通用
第二,不要把控制菜单放在主要位置,把菜单对应URL控制住即可,做一个过滤器即可完成这些工作。
第三、要把系统中的数据资源提取控制住。
第四、要提供丰富的开发接口给别人。比如工作流系统。
权限系统不仅仅是要控制菜单,更多的是企业组织机构模型、
应用模型的建立。
   
0 请登录后投票
最后更新时间:2007-05-10
public MenuRepository getUserMenuRepository(long authSet)   
{  
    Constant constant=Constant.getInstance();  
    //获取系统所有菜单  
    ServletContext app=ApplicationContext.getContext();  
    MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);  
    MenuRepository menuRepository=constant.getMenuRepository();  
    MenuRepository userMenuRepository=new MenuRepository();  
    userMenuRepository.setDisplayers(defaultRepository.getDisplayers());  
    Set menuSet=menuRepository.getMenuNames();  
    Iterator itor=menuSet.iterator();  
    MenuComponent menuComponent =null;  
    //查找满足用户权限的菜单项  
    while(itor.hasNext())  
    {  
        String menuName=(String)itor.next();  
        menuComponent = menuRepository.getMenu(menuName);  
        long roles=Long.parseLong(menuComponent.getRoles());  
        if((roles&authSet)!=0)  
        {  
            userMenuRepository.addMenu(menuComponent);                
        }  
    }  
    //TODO:下面生成用户所能看到的菜单  
    userMenuRepository=menuRepository;  
    return userMenuRepository;  
}
就代码本身而言,
userMenuRepository=menuRepository;
不久已经全部恢复了?
   
0 请登录后投票
最后更新时间:2007-05-21
怎样才能得到任意一个菜单节点在数据库中对应的id号呢?
我想能过节点的id号,在右键中实现删除,更新,添加这三个功能。
可就是不知如何得到节点的id号,请大家帮助兄弟一把。
   
0 请登录后投票
最后更新时间:2008-08-20
我在做由数据库动态产生菜单的时候总是提醒我这个错误:
javax.servlet.jsp.JspException: The displayer mapping for the specified MenuDisplayer does not exist

请哪位大侠帮我看看问题,不胜感谢


代码如下:
struts-config.xml 中有:
    <plug-in className="net.sf.navigator.menu.MenuPlugIn">
      <set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/>
    </plug-in>

meny-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<MenuConfig>
  <Displayers>
    <Displayer   name="ListMenu"
                 type="net.sf.navigator.displayer.ListMenuDisplayer"/>
  </Displayers>
</MenuConfig>

Action 类里面已经写入了

MenuRepository repository = new MenuRepository();
.
.
.
request.setAttribute("examplesRepository", repository);


jsp页:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %>

<menu:useMenuDisplayer name="ListMenu" repository="examplesRepository">
    <menu:displayMenu name="DatabaseMenu"/>
</menu:useMenuDisplayer>
   
1 请登录后投票
论坛首页 Java版 Struts

跳转论坛:
JavaEye推荐