Appfuse:权限控制

Appfuse的权限控制依赖于Struts的Menu机制,common下的menu.jsp是对菜单顺序的定义,详细的菜单项和菜单链接及权限再menu-config.xml中控制,如下:

<Menu name="Logout" title="user.logout" page="/logout" roles="ROLE_ADMIN,ROLE_USER,ROLE_PRODUCT" />

roles中的值即是role表中的name,给那个角色分配菜单的权限,则把角色的name加入到菜单定义的roles中即可。

但使用过程中会发现,这样定义好之后菜单出来是乱的,源自appfuse中的一个Bug,修改文件navbarMenu.vm即可,如下:

 1 #macro( displayNavbarMenu $menu $count)
 2   #if ($displayer.isAllowed($menu))
 3     #set ($count = $count + 1)
 4     ## set menu title
 5     #set ($title = $displayer.getMessage($menu.title))
 6     #if (!$menu.url) #set ($url="javascript:void(0)") #else #set ($url=$menu.url) #end
 7
 8     ## create a single menu item
 9     #if ($menu.components.size() == 0)
10         <li class="#if ($menu.name == $currentMenu)active#end">
11         <a href="$url" title="$title" #if($menu.target)target="$menu.target" #end#if($menu.width)style="width: ${menu.width}px"#end>${title}</a>
12     #else ## create multiple menu items in a menu
13         #if ($menu.components.size() > 0)
14             #set ($hasViewableChildren = false)
15             #set ($renderedChildren = 0)
16             #foreach ($menuIt in $menu.components)
17                 #if ($displayer.isAllowed($menuIt))
18                     #set($hasViewableChildren = true)
19                     #set($renderedChildren = $renderedChildren + 1)
20                 #end
21             #end
22         #end
23
24         <li#if ($hasViewableChildren) class="dropdown#if ($menu.name == $currentMenu) active#end"#end>
25           <a href="#" title="$title"
26              #if($menu.target)target="$menu.target" #end
27              #if($menu.width)style="width: ${menu.width}px"#end
28              class="dropdown-toggle" data-toggle="dropdown">${title}</a>
29     #end
30
31     #if ($menu.components.size() > 0)
32         #if ($hasViewableChildren)
33           <ul class="dropdown-menu">
34         #end
35
36         #set ($count = 0)
37         #foreach ($menuIt in $menu.components)
38             #displayNavbarMenu($menuIt, $count)
39         #end
40
41         #if ($hasViewableChildren && ($count == $renderedChildren))
42           </ul></li>
43         #else
44           </ul>
45           #if ($count > $renderedChildren)
46           </li>
47           #end
48         #end
49     #else
50       </li>
51       #if ($menu.parent && $count == $menu.parent.components.size())
52       ##</ul>
53       #end
54     #end
55   #end
56 #end
57
58 #displayNavbarMenu($menu, 0)

navbarMenu.vm

使用Menu控制权限只能控制到菜单的可见性,如果想深入到数据控制需要自己再处理。下面是通过切入OnSubmit方法做的操作控制:

1. 首先定义切面,切入OnSubmit方法

 1 /**
 2      * 做权限验证,如果用户无权限,则拒绝请求
 3      */
 4     @Override
 5     public Object invoke(MethodInvocation invocation) throws Throwable {
 6         try {
 7             Boolean allow = false;
 8             // 当前执行的操作
 9             String action = "";
10             // 获取当前操作的用户的角色
11             User user = userManager.get(getCurrentUserID());
12             Set<Role> roleList = user.getRoles();
13             // 当前执行的操作,从Request中获取
14             // 基于OnSubmit的签名获取RequestString onSubmit(Greatplace greatplace,
15             // BindingResult errors, HttpServletRequest request,
16             // HttpServletResponse response)
17             if (invocation.getArguments().length == 4
18                     && invocation.getArguments()[2].getClass() == HttpServletRequest.class) {
19                 HttpServletRequest request = (HttpServletRequest) invocation
20                         .getArguments()[2];
21                 if (request.getParameter("save") != null) {
22                     action = RolePermissionManager.PERMISSION_SAVE;
23                 } else if (request.getParameter("delete") != null) {
24                     action = RolePermissionManager.PERMISSION_DELETE;
25                 } else if (request.getParameter("approve") != null
26                         || request.getParameter("unapprove") != null) {
27                     action = RolePermissionManager.PERMISSION_APPROVE;
28                 }
29                 for (Role r : roleList) {
30                     allow = RolePermissionManager.hasPermission(r.getName(),
31                             action);
32                     if (allow)
33                         break;
34                 }
35                 if (!allow) {
36                     request.getSession().setAttribute("successMessages",
37                             "对不起,您无权执行该操作!");
38                     return request.getPathInfo().replace("/", "");
39                 }
40             }
41             Object result = invocation.proceed();
42             return result;
43
44         } catch (IllegalArgumentException ex) {
45             log.error(ex);
46             throw ex;
47         }
48     }

SubmitAdvice

2. 定义自己的权限验证方法,下面是个简单的示例

public class RolePermissionManager {
    /**
     * 权限项:保存
     */
    public static final String PERMISSION_SAVE = "save";
    /**
     * 权限项:审批
     */
    public static final String PERMISSION_APPROVE = "approve";
    /**
     * 权限项:删除
     */
    public static final String PERMISSION_DELETE = "delete";

    /**
     * 角色:管理员
     */
    public static final String ROLE_ADMIN = "ROLE_ADMIN";
    /**
     * 角色:普通用户
     */
    public static final String ROLE_USER = "ROLE_USER";

    /**
     * 基于角色的权限矩阵
     */
    private static Map<String,List<String>> permissionList;

    /**
     * 初始化角色的权限项
     */
    public  RolePermissionManager(){
    }
    /**
     * 判断当前角色是否有指定的权限项
     * @param roleName 角色名称
     * @param permissionName 权限项名称
     * @return
     */
    public static Boolean hasPermission(String roleName,String permissionName){
        return getPermissionList().get(roleName).contains(permissionName);
    }
    /**
     * 定义角色和权限项的规则
     * @return
     */
    public static Map<String,List<String>> getPermissionList(){
        if(permissionList == null){
            permissionList = new HashMap<String,List<String>>();
            //定义管理员的权限
            List<String> adminPermissionList = new ArrayList<String>();
            adminPermissionList.add(PERMISSION_SAVE);
            adminPermissionList.add(PERMISSION_APPROVE);
            adminPermissionList.add(PERMISSION_DELETE);
            permissionList.put(ROLE_ADMIN, adminPermissionList);
            //定义普通用户的权限
            List<String> userPermissionList = new ArrayList<String>();
            permissionList.put(ROLE_USER, userPermissionList);
        }
        return permissionList;
    }
}

RolePermissionManager

这样基本的权限控制目的就能达到。

关于用户看到的数据权限我通过url中的参数,结合search来控制,但这样只要修改url中的参数就可越过数据权限,有待优化。

时间: 2024-10-13 13:11:00

Appfuse:权限控制的相关文章

rbac 权限控制

RBAC 的控制,大致是通过将角色的权限控制,来控制用户的权限. 需要构建的表为 用户表(user) ,角色表(role),节点表(node),三张主表 , 节点表内记录的是所有的权限和方法. 2张关联表,是为了关联3张数据表的,分别未 角色用户表(user_role),角色权限表(role_node),也可将两张表写成字段分别加入到用户表和权限表内; 废话不多说看下,键表语句如下 用户表: CREATE TABLE `wj_admin` ( `id` int(11) NOT NULL AUTO

译-BMC Remedy Action Request System权限控制概述

原文链接:Access control overview 说明: BMC Remedy Action Request System是BMC ITSM产品平台,简称AR 或者Remedy,可实现基于ITIL标准的整个IT管理流程的实施定制.该平台可实现多种权限级别的管理,包括人员.组.角色,以及表.字段.行级别等.本文可以用作其他对权限要求比较精细的系统参考. 为了便于理解,部分名词翻译如下: Server:服务器Form (or table):表单Field (or column):字段Acti

基于MVC4+EasyUI的Web开发框架形成之旅--权限控制

我在上一篇随笔<基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍>中大概介绍了基于MVC的Web开发框架的权限控制总体思路.其中的权限控制就是分为"用户登录身份验证"."控制器方法权限控制"."界面元素权限控制"三种控制方式,可以为Web开发框架本身提供了很好用户访问控制和权限控制,使得用户界面呈现菜单.Web界面的按钮和内容.Action的提交控制,均能在总体权限功能分配和控制之下. 本篇文章主要细化这三个方面

Orchard 之:Widget,兼看 Layer 在权限控制中的作用

一:Widget 可以理解为控件,可以直接被页面所引用.行为类似与分部页面,比如,我们可以创建一个 商品列表 Widget,然后这个 Widget 就可以被很多页面所引用. 理解 Widget 这个概念,我们不得不理解另外两个概念: 1:Layer Orchard 默认有这么几个层,Default.Authenticated.Anonymous.Disabled.TheHomepage.Layer 用于承载什么时候 Widget 将会被展现,这么讲大家一定觉得很抽象,其实 Layer 存在的意义

SpringMVC + Mybatis + SpringSecurity(权限控制到方法按钮) + Rest(服务) + Webservice(服务) + Quartz(定时调度)+ Lucene(搜索引擎) + HTML5 bootstrap + Maven项目构建绝对开源平台

框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz(定时调度) + Bootstrap Html5(支持PC.IOS.Android) 需要源码请加Q:3121026417   此处[源码获取地址] 框架简介: 项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化.服务化.原子化的方案,将功能模块进行

CloudStack API访问权限控制

在我写开始之前,请先看下CS中国社区的一篇文章http://www.cloudstack-china.org/2012/12/1465.html,在第1点里讲了关于权限级别,command属性文件位置等问题.不过4.3现在的除了command.properties外,作者提到的其它properties文件现在好像都没有了,而且command里面现在形如***command=15,"="后面不再有处理请求命令的类. API请求由ApiServlet拦截后,会调用verifyRequest

使用JavaEE的ServerAuthModule模块和web.xml进行相应配置,实现对用户的权限控制

ServerAuthModule这里不细说,可以自行百度. 重点在注释: <!-- 给web-app划分角色 --> <security-role> <role-name>spx.main</role-name> </security-role> <security-role> <role-name>spx.user</role-name> </security-role> <!-- 只有配置

权限控制

权限概述 系统中有很多功能,这些功能并不是每一个登录的用户都能操作的,需要对用户操作系统的能力进行限制,该过程就叫权限 认证:系统提供的标识用户身份的功能(通常实现比如:登录)(告诉系统你是谁?) 授权:系统提供的根据用户的身份赋予其不同的操作系统能力功能(告诉系统你能做什么?) 系统启动 ---->web.xml|--->spring容器--->扫描Action Service Dao |--->OAListener---->通过spring容器中的service加载权限数

springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】

项目结构: 1.maven项目的pom中引入shiro所需的jar包依赖关系 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <dependency>     <groupid>javax.servlet</groupid>     javax.servlet-api</artifactid>     <version>3.0.1</version>