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

实施软件质量保障体系CMM/TSP/PSP的建议

实施软件质量保障体系CMM/TSP/PSP的建议 作者:xiaozhou 发布时间:2001/04/10 文章摘要:  本文试着从软件质量保证方向出发,概要阐述CMM(the Capability M...
  • CandyCat
  • CandyCat
  • 2001-05-17 21:38:00
  • 2425

关注分离的艺术

关注分离的艺术 英文原文:The Art of Separation of Concerns 前言 在软件工程中,关注的分离是指在...
  • zdy0_2004
  • zdy0_2004
  • 2015-09-13 15:30:21
  • 581

Spring AOP 实现主从读写分离

深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的。...
  • liyongshun82
  • liyongshun82
  • 2016-10-11 12:50:50
  • 485

spring(AOP)权限处理

思路: 1、写dao层和service层的类和接口 2、自定义的注解@PrivilegeInfo 3、注解解析器:解析目标方法上面的注解的name属性的值 4、写一个权限类Privilege(name...
  • qq_20261343
  • qq_20261343
  • 2016-02-12 13:00:48
  • 1616

设计模式 关注点分离

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

AOP应用之权限管理

在系统实现中AOP常用于并发、权限管理、事务处理、日志记录、错误处理方面。本文介绍如何使用EnterpriseServerBase类库中的AOP框架来实现权限管理。一个用户是否有权限调用某个操作(方法...
  • zhuweisky
  • zhuweisky
  • 2005-08-23 17:32:00
  • 8258

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

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

使用spring的aop进行权限拦截

一个SSI的项目(springmvc+mybatis),需要加上权限验证(非数据权限),考虑使用aop来实现。大致思路是使用自定义注解,在需要权限控制的方法前(controller层)使用注解定义方法...
  • liuxiao723846
  • liuxiao723846
  • 2015-08-04 18:05:44
  • 1538

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

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

深入理解 String AOP

什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封...
  • Victor_Zhang_SH
  • Victor_Zhang_SH
  • 2016-12-09 20:59:00
  • 677
收藏助手
不良信息举报
您举报文章:AOP分离权限关注 - 补遗
举报原因:
原因补充:

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