SpringMVC+Annotation实现方法、按钮级别的细粒度权限控制

常用的权限系统设计模式是以角色为核心的,即角色是具有相同权限的一类人员的集合:

1.     一个角色可以有包含多个操作人员,一个操作人员也可以属于多个角色

2.     一个角色可以具有多个功能的操作权限,一个功能也可以被多个角色所拥有。

在登录时通过查询登录用户所属角色,即可得到个用户的所有功能集合,如下图:

多数业务系统的页
面功能菜单设计是以三级为标准的,即一级功能菜单、二级功能菜单、三级功能菜单,通常情况下一二级功能菜单只是用于功能分类,是不具有功能访问地址的,三
级菜单才是功能的真正入口,常规权限系统就是通过控制每个人员对应的功能菜单的显示与隐藏来实现权限控制。要实现细粒度权限控制,可在设计功能表时再加入
第四层:页面元素,隶属于第三层功能菜单,这些页面元素用来标识功能页面中的每一个功能按钮,如增加、修改、删除、查询都可算是页面元素,在为角色分配权
限时,第四层也同样纳入统一权限管理,如果有此页面元素的权限,则页面上就显示该按钮,如果没有此页面元素的功能权限,则该按钮就不会显示出来。

对于没有权限访问的功能或页面除了进行前台的隐藏之外,还需要在后台访问时进行权限的验证,否则操作人员绕开页面直接通过输入URL访问功能就会造成权限漏洞,通过SpringMVC+Annotation的方式可以轻松实现,代码如下:

第一步:创建SpringMVC拦截器,拦截所有需要进行权限验证的功能请求

     <!-- 开启注解 -->
    <mvc:annotation-driven/>
    <!-- 静态资源访问 -->
     <mvc:resources location="/static/" mapping="/static/**"/> 

     <!-- 拦截器 -->
      <mvc:interceptors>
        <!-- 多个拦截器,顺序执行 -->
        <mvc:interceptor>
          <!-- 如果不配置或/**,将拦截所有的Controller -->
           <mvc:mapping path="/**" />
           <!-- 在Freemarker界面展示之前做一些通用处理   -->
           <bean class="xx.xxxx.core.web.FreeMarkerViewInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>  

第二步:创建作用于Method级别的Annotation类,用于传入功能ID

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Permission {

    /**
     * 功能ID,该功能ID,对应数据库中的功能ID
     * @return
     * @version V1.0.0
     * @date Jan 13, 2014 4:59:35 PM
     */
    String value();

}

第三步:通过静态常量建立数据库中的功能ID与执行方法的一对一关系

public class FuncConstants {

    /**
     * 系统管理-角色管理-增加角色
     */
    public final static String Xtgl_Jsgl_AddJs = "4399d98bb0d84114acb5693081e83bc9";
    /**
     * 系统管理 - 部门管理- 部门列表
     */
    public final static String Xtgl_Bmgl_BmList = "dbc4bf80f8b6418788b79de204d37932";

}

第四步:在SpringMVC拦截器中验证权限

/**
 * FreeMarker视图拦截器,页面展示之前做一些通用处理
 * @version V1.0.0
 * @date Dec 12, 2013 4:20:04 PM
 */
public class FreeMarkerViewInterceptor extends HandlerInterceptorAdapter {

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception {

    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView view) throws Exception {
        String contextPath = request.getContextPath();
        if (view != null) {
            request.setAttribute("base", contextPath);
        }
    }

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //处理Permission Annotation,实现方法级权限控制
        HandlerMethod method = (HandlerMethod)handler;
        Permission permission = method.getMethodAnnotation(Permission.class);

        //如果为空在表示该方法不需要进行权限验证
        if (permission == null) {
            return true;
        }

        //验证是否具有权限
        if (!WebUtil.hasPower(request, permission.value())) {
            response.sendRedirect(request.getContextPath()+"/business/nopermission.html");
            return false;
        }
        return true;

        //注意此处必须返回true,否则请求将停止
        //return true;
    }

}

至此,基于按钮、方法验证的细粒度权限体系完成!

时间: 2024-11-05 22:36:04

SpringMVC+Annotation实现方法、按钮级别的细粒度权限控制的相关文章

(转)通过SpringMVC+Annotation实现方法、按钮级别的细粒度权限控制

原文地址:http://blog.csdn.net/ycyk_168/article/details/18456631 随着企业信息化的不断深入,各种各样的信息系统成为提高企业运营及管理效率的必备工具,越来越多的企业核心机密如销售机会.客户资料.设计方案等通过信息系统存储.备案.流转,这些核心资料一旦外泄,势必对企业造成极大损失.科技时代,信息是企业生存的命脉,信息的安全也必然成为企业极度重视的问题.如今,随着各种信息安全措施的实施,信息泄密已经从外部泄漏向内部人员泄漏转移.外部的黑客.病毒要想

通过注解@做细粒度权限控制

先定义一个注解 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface AnnotationLimit { String mid(); String pid(); } public static void main(String[] args) throws NoSuchMeth

粗粒度与细粒度权限控制

1.1   什么是粗粒度和细粒度权限 粗粒度权限管理,对资源类型的权限管理.资源类型比如:菜单.url连接.用户添加页面.用户信息.类方法.页面中按钮.. 粗粒度权限管理比如:超级管理员可以访问户添加页面.用户信息等全部页面. 部门管理员可以访问用户信息页面包括 页面中所有按钮. 细粒度权限管理,对资源实例的权限管理.资源实例就资源类型的具体化,比如:用户id为001的修改连接,1110班的用户信息.行政部的员工. 细粒度权限管理就是数据级别的权限管理. 细粒度权限管理比如:部门经理只可以访问本

关于细粒度权限控制的考量

权限控制可以说是每个项目的必备基础模块,不讨论RBAC和ACL,只是自己的想法. 我眼中的权限控制: 作用:用于控制功能或资源的访问,仅此而已. 无论是SpringMVC的拦截器,还是Struts的拦截器,拦截地址栏操作都是那么的简单. 问题在于如何将权限控制在页面级别,例如,按钮,某个资源元素等. 关于命名约定的问题: 例如添加功能: @RequestMapping(value="/role/add.jhtml",RequestMethod=GET) @RequestMapping(

.NET 通用高扩展性的细粒度权限管理架构(webApi/Mvc)

一. 权限场景分析: 1. 系统具有角色概念, 部门概念, 且都具有相应不同的权限 2. 用户具有多个角色, 多个部门等关系, 并且能给单个用户指派独有的权限 3. 具有细粒度权限控制到资源的RBAC, 能控制页面, 控制菜单, 控制逻辑, 控制单个操作, 控制到单一数据; 且具有一定的可扩展性 4. 适用于webapi/ mvc / wcf / webservice  混合项目中 5. 设置权限和验证权限易用性高 二. 数据库表设计 1. 角色表 2. 部门表 3. 用户表 4. 菜单表 5.

Spring Security(17)——基于方法的权限控制

目录 1.1     intercept-methods定义方法权限控制 1.2     使用pointcut定义方法权限控制 1.3     使用注解定义方法权限控制 1.3.1    JSR-250注解 1.3.2    @Secured注解 1.3.3    支持表达式的注解 1.4     方法权限控制的拦截器 1.4.1    MethodSecurityInterceptor 1.4.2    AspectJMethodSecurityInterceptor 之前介绍的都是基于URL

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构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化.服务化.原子化的方案,将功能模块进行

关于js复制文本信息(按钮级别)

最近应产品要求,需要实现一个按钮级别热复制文本功能,效果就是单击按钮复制对应的文本,该文本是需要从数据库里面取出来然后加密的,最初的打算是使用js插件在前台页面搞定.    于是上网找了一些相关资料,发现几乎都是用的zeroClipBoard这个插件,这个插件使用的是flash来实现复制效果,但是flash在目前已 经不再流行,甚至有些浏览器已经不再对flash支持或者完全禁用,于是便暂时放弃了这个想法.但是在查找途中发现ie竟然可以一句代码搞定复制,顿时觉 得好无语(尤其是对比ie和其他浏览器

Vue多页面 按钮级别权限控制 directive指令控制

利用driective 构建自己的指令,实现按钮级别权限 项目结构如下: 修改router.js { path: 'schools', name: '列表', component: () => import('./eduAdministration/SchoolList'), meta: { permissions: ['schools'], btnpermissions:['admin','test'], title: '列表', icon: '', scrollToTop: true } }