AOP分离权限关注 - 补遗

原创 2004年07月23日 10:09:00

昨天的Blog中我描述了使用AOP分离权限关注的基本做法。回家仔细想了想,把思考的结果补充一下。

我们知道,在基本的RBAC模型中有以下基本(接口)对象:Domain, Group, User, Role, Privilege, Operation, Resource以及对外的SecurityManager。Privilege通过Operate Resource而产生,Role则对应若干个Privilege。不同的Domain, Group, User拥有不同数量的Role,其中User的Role可以继承自Group,也可以继承自Domain;Group的权限可以继承自Domain。对外表现时,可以简单地通过SecurityMananger.checkPermission(User,  Privilege)的返回值true/false进行判断。上面每个对象都是接口,SecurityManager可以通过IoC反向注入,从而使得这种权限模型的使用比较灵活。

在实际情况中,这种权限系统中Resource的定义方法与粒度最难以控制。不同的业务系统中可能有不同的定义方式。而且这种方式的交流非常不方便。以一个普通的“科研项目管理”项目为例:系统中需要进行权限控制的东西可能有:用户信息(增删改查),项目信息(增删改查),日志信息(查看,统计)等等。这种权限的控制如果按照垂直编程的方式来写,需要进行以下工作:

研究:需要控制的资源到底是什么?用户信息?项目信息?这些东西如何表现?这个问题在这种模型中很难考虑清楚。最终的结果往往是,使用没有Resource接口的权限模型,形成一份新的文档:权限代码以及对应说明表。每个编程人员在编写相应的业务逻辑时,都需要参考这个表,并将程序中加上一序列的if --- else来判断权限。这种做法无疑是危险的。因为一旦权限代码发生变动, 这个业务方法马上得重写。稍微考虑不难知道,这种方法根本不可取:连基于URI的解决方案都不如。

可以看到,像用户信息、项目信息等等,都是业务对象,这些业务对象对于人是可理解的,但将这些业务对象作为RBAC中的资源是不合理的。因此我提出一种新的资源概念:将具体业务类、业务方法作为RBAC模型中的资源。这样才能够真正脱离权限与业务逻辑。具体做法是:将所有的业务方法名称以及对应的角色名称存入到XML文件或者数据库中,形成一个Resource库:

Method                   Role
------------------------------------------
UserManager.*            UserManager
UserManager.update       UserManager
UserManager.update       User
LogInfo.view             *
LogInfo.statistics       LogManager
...                      ...
------------------------------------------

对于权限的判断,可以在RBAC的具体实现中进行。这里假定有一个SecurityManager.checkPermission(User, Privilege)(这里的Privilege实际上就是能否执行特定业务方法)的方法。根据这个方法,制作一个Aspect:

public class PermissionCheckAdvice implements MethodBeforeAdvice {
    public void before(Method arg0, Object[] arg1, Object arg2)  throws Throwable {
          if (!SecurityManager.checkPermission(User, Privilege)) {
                throws new PermissionDeniedException(User, Privilege);
          }
    }
}

然后使用AOP将这个Advice应用到所有的业务方法(类或者方法可能在具有普遍意义的一个package中,也可能具有一定正则意义),并截获所有的PermissionDeniedException:

public class PermissionThrowsAdvice implements ThrowsAdvice {
    public void afterThrowing(Method method, Object[] args, Object target,
            Throwable subclass) {
        //对Permission Denied Exception进行自己的处理。
    }

}

对应的Spring Beans配置请参考我的上一Blog。

AOP分离权限关注的文字到此截至,有些比较重要但是来不及完成的如SecurityManager如何引入,上下文环境如何取得等等,可能需要各位自行完成了。这里提出的是一种将Method作为资源的概念,希望对做权限系统的同仁有所帮助。

我的Blog: http://www.webuc.net/mechiland

基于SpringAOP的数据库读写分离实现

之前有个项目需要实现数据库读写分离,实现以后今天跟大家分享一下 demo需求: 分享的demo是为了实现对用户表的查询操作对从库操作,增删改对主库操作。demo实现: 基于SpringAOP的实...
  • qism007
  • qism007
  • 2016年10月31日 13:59
  • 880

使用Spring AOP切面解决数据库读写分离

为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库...
  • linsongbin1
  • linsongbin1
  • 2015年07月31日 11:07
  • 12581

设计模式 关注点分离

好的架构设计必须把变化点错落有致地封装到软件系统的不同部分。要做到这一点,必须进行关注点分离。Iuar Jacobson在《AOSD中文版》中写道: “好的架构必须使每个关注点相互分离,...
  • meegomeego
  • meegomeego
  • 2014年03月14日 18:34
  • 1169

使用Spring AOP实现MySQL数据库读写分离案例分析

一、前言分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)数据的速度和并发量。在进行数据库读写分离的时候,我们首先要进行数据库的主...
  • u010870518
  • u010870518
  • 2016年12月29日 19:15
  • 13164

使用拦截器或者AOP实现权限管理(OA系统中实现权限控制)

使用拦截器或者AOP实现权限管理(OA系统中实现权限控制)
  • canot
  • canot
  • 2016年02月08日 21:22
  • 6569

Spring AOP 实现功能权限校验功能

实现功能权限校验的功能有多种方法,其一使用拦截器拦截请求,其二是使用AOP抛异常。 首先用拦截器实现未登录时跳转到登录界面的功能。注意这里没有使用AOP切入,而是用拦截器拦截,因为AOP一般切入的是...
  • houxuehan
  • houxuehan
  • 2016年06月23日 17:11
  • 7660

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享。需求:service层有一些方法,这些方法...
  • Minhellic
  • Minhellic
  • 2016年07月15日 17:29
  • 8804

使用spring aop实现业务层mysql 读写分离

spring aop , mysql 主从配置 实现读写分离,下来把自己的配置过程,以及遇到的问题记录下来,方便下次操作,也希望给一些朋友带来帮助。 mysql主从配置参看:http://blog....
  • huoyunshen88
  • huoyunshen88
  • 2014年07月03日 17:35
  • 14412

架构设计关注点分离

关注点分离(Separation of concerns,SOC)是对只与“特定概念、目标”(关注点)相关联的软件组成部分进行“标识、封装和操纵”的能力,即标识、封装和操纵关注点的能力。是处理复杂性的...
  • zxytsb
  • zxytsb
  • 2017年06月16日 11:54
  • 347

springAOP与自定义注解实现细粒度权限控制管理

IOC与AOP无疑是spring的核心,提供了非常强大的功能,这两个思想为我们开发带来了巨大的方便。 这里我们aop简单实现一些权限控制,用到的aop提供的环绕通知,至于spring提供了那些通知,...
  • s8460049
  • s8460049
  • 2016年08月11日 14:46
  • 4103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AOP分离权限关注 - 补遗
举报原因:
原因补充:

(最多只允许输入30个字)