`
paulwong
  • 浏览: 74358 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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())   
分享到:
评论
2 楼 guoweihelloworld 2013-11-25  
[b]: [
引用
b]文字 (alt+b)[/b][/b]
http:[size=x-small][/size]//www.iteye.com
/i
  • [list]
  • [*][list]
  • [*][*][list]
  • [*][*][*][list]
  • [*][*][*][*][list]
  • [*][*][*][*][*][list]
  • [*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*]
    [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]
    [/flash][/flash][/flash]
    |||||||||||||
  • [*][*][*][*][*][*][*][*]||||||||||||
  • ||||||||||||
  • [*][*][*][*][*][*][*][*]|||||||||||
  • |||||||||||
  • [*][*][*][*][*][*][*][*]||||||||||
  • ||||||||||
  • [*][*][*][*][*][*][*][*]|||||||||
  • |||||||||
  • [*][*][*][*][*][*][*][*]||||||||
  • ||||||||
  • [*][*][*][*][*][*][*][*]|||||||
  • |||||||
  • [*][*][*][*][*][*][*][*]||||||
  • ||||||
  • [*][*][*][*][*][*][*][*]|||||
  • |||||
  • [*][*][*][*][*][*][*][*]||||
  • ||||
  • [*][*][*][*][*][*][*][*]|||
  • |||
  • [*][*][*][*][*][*][*][*]||
  • ||
  • [*][*][*][*][*][*][*][*]|
  • |
  • [*][*][*][*][*][*][*][*]
  • [*][*][*][*][*][*][*]
  • [*][*][*][*][*][*][/list]
  • [*][*][*][*][*][/list]
  • [*][*][*][*][/list]
  • [*][*][*][/list]
  • [*][*][/list]
  • [*][/list]
  • [/list]
  • [/list]mages/smiles/icon_sad.gif
    1 楼 zhuqx1130 2007-12-27  
    securityContextHolderAwareRequestFilter 加到什么位置上啊

    相关推荐

      struts-menu集成struts2.3.1例子以及注意的地方

      例如,你可以通过在Action中处理用户角色和权限,然后在`struts-menu`的配置中过滤掉用户无权访问的菜单项。 总结一下,`struts-menu`与Struts2.3.1的集成可以帮助开发者快速构建优雅的Web应用菜单,减少页面布局的...

      Struts-menu例子加视频

      6. **集成与扩展**:Struts-menu可以轻松集成到现有的Struts应用中,同时也允许开发者进行扩展,例如添加新的菜单样式、行为或者与第三方权限框架的整合。 7. **实践应用**:通过提供的例子,学习者可以了解如何在...

      struts-menu权限按钮(项目例子)

      Struts-menu正是为了解决这一问题而诞生的,它将权限按钮的展示与用户的权限紧密结合起来。 Struts是Apache软件基金会下的一个开源MVC框架,用于构建基于Java的、可维护性高的Web应用程序。在Struts框架中,开发者...

      权限控制(struts2+hibernate+spring+struts-menu+valuelist)

      在项目中,struts-menu会基于用户的角色和权限信息,生成仅包含用户有权访问的菜单,这样可以确保用户界面的简洁性和安全性。 最后,valuelist是实现信息分页的一种机制,它帮助在大量数据列表中分页展示结果,提升...

      基于数据库的struts-menu.rar

      4. **Action类**:在Struts框架中创建一个Action,负责调用DAO获取当前用户有权访问的菜单,可能需要结合用户登录信息和角色权限。 5. **Session Action**:可能需要使用Session Action将菜单数据保存在用户的会话...

      J2EE 0.4—加入批量CRUD功能、加入框架页面、加入struts-menu等

      在实际开发中,这三部分的结合意味着开发者正在构建一个具有高效数据管理能力的J2EE应用,用户界面通过框架页面保持一致性和易用性,同时通过Struts Menu提供基于角色的动态菜单导航。这样的系统既满足了业务需求,...

      初涉StrutsMenu

      在Struts2框架中,StrutsMenu还支持与Struts2的拦截器结合,实现动态加载用户权限相关的菜单。你可以在用户的登录信息中存储权限标识,然后在拦截器中根据这些权限过滤掉无权访问的菜单项。 总的来说,StrutsMenu是...

      struts_menu源码web集成

      Struts_Menu则是针对Struts框架的一个扩展,主要用于生成动态的、可配置的菜单结构,这在大型企业级应用中十分常见,因为它可以灵活地根据用户角色和权限展示不同的菜单项。 Struts_Menu的核心组件包括以下几个部分...

      struts+hibernate的一个菜单框架

      而在Struts层面,可能会有一个专门的Action来处理菜单的请求,根据用户角色和权限动态生成菜单结构。这可能涉及到Session级的缓存或者拦截器来实现权限检查。 项目中的`webModel`目录可能包含了Struts的模型组件,...

      struts做的权限设计

      ### Struts实现的权限设计详解 #### 一、资源(Resource) 在系统权限设计中,**...通过上述介绍,我们可以看到,通过配置文件的方式定义角色和资源,并结合框架本身的扩展,可以灵活地实现各种复杂的权限控制需求。

      SSH的用户角色菜单管理

      SSH(Struts2 + Spring + Hibernate)是Java开发中常用的一个集成框架,它结合了Struts的MVC设计模式、Spring的依赖注入以及Hibernate的对象关系映射,为开发者提供了一个强大的企业级应用开发基础。在"SSH的用户...

      java的细粒度权限和shiro权限校验 ssh

      5. **细粒度权限实现**:在Hibernate层面,可以为每个数据实体定义权限字段,比如在User表中添加角色和权限关联,同时在Menu或Resource表中添加对应的操作权限。在用户登录后,根据其角色加载相应的权限,以便在...

      JSF+SSH开发应用实例

      3. **Struts框架**: Struts是基于MVC设计模式的Web应用框架,主要用于控制应用程序的流程。它通过Action类来处理用户的请求,并决定接下来的视图。在JSF+SSH集成中,Struts通常用作连接JSF和Spring的桥梁,处理HTTP...

      lams.rar_java权限 源码_权限管理系统

      《基于Struts2、Hibernate3和Spring3的Java权限管理系统详解》 在现代软件开发中,权限管理是不可或缺的一部分,它确保了系统安全性和数据隐私。本文将详细讲解一个使用Struts2、Hibernate3和Spring3框架构建的Java...

      ssh框架下用ajax动态从数据库查询的菜单

      在SSH(Spring、Struts和Hibernate)框架下,利用AJAX动态从数据库查询并加载菜单是一种常见的需求,尤其是在开发Web应用程序时,为了提供用户友好的交互体验。下面将详细讲解如何实现这一功能。 首先,我们需要...

    Global site tag (gtag.js) - Google Analytics