paulwong

          Struts-Menu結合角色權限的應用

          STRUTS-MENU簡介:


          STRUTS-MENU支持靜態和動態菜單,數據來源和顯示方式分開,菜單文字國際化,權限。

          <menu:useMenuDisplayer name="Velocity" config="/framework/res/menucomp/templates/xtree.html"  bundle="org.apache.struts.action.MESSAGE" repository="userMenuRepository"  permissions="rolesAdapter">  
              
          <logic:iterate id="menuName" name="userParentMenuNameList" indexId="index">  
                  
          <menu:displayMenu name='<%=menuName.toString()%>' />  
              
          </logic:iterate>       
          </menu:useMenuDisplayer>  


          靜態:只須在標簽內加上

          <menu:displayMenu name="Home" />


          動態:在menu:useMenuDisplayer 中加上:repository="userMenuRepository"

          顯示樣式:在menu:useMenuDisplayer 中加上:name="Velocity"

          國際化:在menu:useMenuDisplayer 中加上:bundle="org.apache.struts.action.MESSAGE"

          權限:在menu:useMenuDisplayer 中加上:permissions="rolesAdapter",如果名字是"rolesAdapter"則會自動調用
          默認的net.sf.navigator.menu.RolesPermissionsAdapter:

          /*
           * RolesPermissionsAdapter.java
           *
           * Created on December 7, 2002 2:25 PM
           
          */


          package net.sf.navigator.menu;

          import javax.servlet.http.HttpServletRequest;
          import java.util.regex.Pattern;

          /**
           * This class used container-managed security to check access
           * to menus.  The roles are set in menu-config.xml.
           *
           * 
          @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
           
          */

          public class RolesPermissionsAdapter implements PermissionsAdapter {
              
          private Pattern delimiters = Pattern.compile("(?<!\\\\),");
              
          private HttpServletRequest request;

              
          public RolesPermissionsAdapter(HttpServletRequest request) {
                  
          this.request = request;
              }


              
          /**
               * If the menu is allowed, this should return true.
               *
               * 
          @return whether or not the menu is allowed.
               
          */

              
          public boolean isAllowed(MenuComponent menu) {
                  
          if (menu.getRoles() == null{
                      
          return true// no roles define, allow everyone
                  }
           else {
                      
          // Get the list of roles this menu allows
                      String[] allowedRoles = delimiters.split(menu.getRoles());
                      
          for (int i=0; i < allowedRoles.length; i++{
                          
          if (request.isUserInRole(allowedRoles[i])) {
                              
          return true;
                          }

                      }

                  }

                  
          return false;
              }



          }


          在顯示菜單項時,會判斷菜單所定義的角色是否與用戶的角色吻合,是則顯示,否則不顯示。

          如果使用ACEGI作為權限柜架,只須加上securityContextHolderAwareRequestFilter即可。



          在前一個項目當中要根據登入用戶的權限進行菜單顯示:我把其中相關的代碼提煉出來.
          在系統啟動時把菜單信息加載近來.通過擴展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>  

          posted on 2007-07-16 23:07 paulwong 閱讀(1825) 評論(1)  編輯  收藏 所屬分類: J2EE

          Feedback

          # re: Struts-Menu結合角色權限的應用 2014-03-07 12:20 最代碼

          你好,我根據你的博客整理到了zuidaima.com上,地址:http://www.zuidaima.com/share/1724475036945408.htm,有版權請告知。  回復  更多評論   


          主站蜘蛛池模板: 镇巴县| 嘉善县| 定襄县| 海南省| 鹤岗市| 启东市| 淮滨县| 湛江市| 邵武市| 内江市| 华容县| 遂溪县| 建德市| 尚志市| 乌拉特前旗| 甘孜县| 岐山县| 铅山县| 兴国县| 韶关市| 鄂尔多斯市| 寿阳县| 石林| 万宁市| 且末县| 上虞市| 江口县| 拜城县| 西丰县| 满城县| 淄博市| 仙桃市| 麻江县| 衡阳市| 钟祥市| 湘潭市| 杭锦后旗| 滦平县| 吐鲁番市| 司法| 东光县|