以往在J2EE系统中,访问权限控制系统的实现主要有两种:应用程序实现和J2EE容器实现。
传统的应用程序实现
这是最直接的、传统的一种解决方式,通常是在具体方法前加一个权限判断语句,如下:
public class ForumFactoryProxy extends ForumFactory {
......
public Forum createForum(String name, String description)
throws UnauthorizedException, ForumAlreadyExistsException
{
if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
Forum newForum = factory.createForum(name, description);
return new ForumProxy(newForum, authorization, permissions);
}else {
throw new UnauthorizedException();
}
}
......
}
上述代码是Jive论坛中一段创建论坛功能的代码,在创建论坛前,首先进行权限角色检验,如果当前用户是系统管理员,那么可以实现真正的创建。
这种在具体功能前加入权限操作检验的实现方式有很多缺点:
1.每个功能类都需要相应的权限检验代码,将程序功能和权限检验混淆在一起,存在紧密的耦合性,扩展修改难度大。
2.如果类似Jive,以代理模式为每个功能类实现一个相应的代理类,虽然解耦了程序功能和权限检验,但是,从某个角色的权限检验这个切面考虑,涉及具体Proxy类太多,扩展修改难度大。
J2EE容器实现
在AOP概念没有诞生前,J2EE规范已经提供了关于权限控制的容器实现标准,这种变迁结果如下图所示:
原来需要每个应用程序实现的权限Proxy转为整个容器的Proxy实现,其中JDK1.3以后的动态代理API为这种转换实现提供了技术保证。
非常明显,通过容器实现权限控制验证可以大大简化应用程序的设计,分离了应用系统的权限关注,将权限控制变成了对J2EE容器服务器的配置工作,具体技术细节参考我的书籍《Java实用系统开发指南》第六章。
其实,容器的权限实现也是一种从一个切面来解决问题方式,AOP概念诞生后,权限控制实现由此也带来了两个方向的变化:
1. J2EE容器级别的权限实现,也就是容器自身的权限实现。
2. J2EE应用程序级别的权限实现。
权限控制在容器级别实现似乎使得J2EE开发者感觉没有灵活性和可扩展性,其实象JBoss 4.0这样的J2EE容器,由于引入了AOP概念,使得J2EE开发者在自己的应用系统中能够直接操纵容器的一些行为。容器和应用系统由于AOP引入的Aspect切面,变得可以成为一体了。(如果使用BEA的EJBC编辑要浪费多少时间?)
对于J2EE应用系统开发者,能够做到上述境界,必须的条件是对JBoss之类J2EE容器必须有足够的了解,因为这些方式并不是J2EE标准,有可能在移植到新的J2EE容器,这些知识和投入变得无用(也有可能将来J2EE扩展其标准)。
很显然,使用AOP实现J2EE应用系统级别的权限控制,是解决上述移植风险的一个主要方法,但是带来的缺点是必须亲自从零开始做起,耗费时间不会很短。
AOP下的应用程序权限控制实现
引入AOP概念后的权限实现已经不是前面Jive实例那样“落后”,我们对这个实例进行重整(Refactorying)如下:
创建一个Aspect,专门用于权限检查,如下:
private static aspect PermissionCheckAspect {
private pointcut permissionCheckedExecution() :
execution ( public Forum ForumFactory.createForum(String , String ));
before () : permissionCheckedExecution() {
if !(permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
throw new UnauthorizedException();
}
}
}
该段代码功能是:当系统运行ForumFactory.createForum方法之前,将首先检查是否有权限操作。
代码中pointcut触发的条件是createForum方法执行,如果有其它需要系统管理员身份才能执行的方法加入,将写成如下代码:
private pointcut permissionCheckedExecution() :
execution ( public Forum ForumFactory.createForum(String , String )) ||
execution ( public Forum ForumFactory.deleteForum(String , String )) ||
......
execution ( public Forum ForumFactory.deleteThread(String , String ));
这些方法陈列比较琐碎,依据AspectJ语法,可以简化如下:
private pointcut permissionCheckedExecution() :
execution ( public * ForumFactory .*(..));
有兴趣者可以将Jive论坛中相关权限Proxy部分使用AOP重整,另外,由于Jive没有引入角色概念,导致权限和用户HardCode在编码中,如何实现权限和用户解耦,最小限度的降低HardCode量,角色概念在其中起着不可忽视的重要作用。这是另外一个研究课题了。
分享到:
相关推荐
【AOP下的权限控制实现】 面向方面的编程(AOP)是一种强大的编程范式,它针对传统面向对象编程(OOP)在处理横切关注点时的局限性进行了优化。横切关注点指的是那些贯穿多个模块的功能,如权限控制、日志记录、...
Java Spring AOP 权限控制 Java Spring AOP 权限控制是指在 Java ...权限控制可以通过传统的应用程序实现和 J2EE 容器实现来实现,但是使用 AOP 技术可以将权限控制实现与业务逻辑分离,提高代码的可读性和维护性。
### 使用AOP进行权限控制:深入解析与实施 #### 背景 在现代软件开发中,权限控制是确保系统安全、数据隐私和合规性的关键环节。然而,在传统的开发模式下,权限控制代码往往散布在应用程序的各个角落,导致代码...
详情请查看博客:<a href='https://blog.csdn.net/byteArr/article/details/103984725'> springboot+自定义注解+AOP实现权限控制(一)和<a href='https://blog.csdn.net/byteArr/article/details/103992016'> ...
**AOP编程与权限控制详解** 在软件开发中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在减少代码的重复性和提高代码的可维护性。AOP允许程序员定义“方面”,这些方面是关注点的模块...
在这个"Spring Boot AOP权限控制模块开发"项目中,我们将深入探讨如何利用AOP来构建一个自定义的权限管理模块。 首先,AOP的核心概念是切面(Aspect)、通知(Advice)、连接点(Join Point)、切点(Pointcut)和...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们在不修改源代码的情况下对程序的...这个简单的示例展示了如何利用Spring AOP进行权限控制,实际应用中,可以根据具体需求进行更复杂的定制和优化。
通过以上步骤,我们创建了一个基于Spring AOP的权限验证框架,实现了对用户权限的灵活控制。这种方式不仅简化了代码,提高了代码复用性,还使得权限验证策略可以根据需求轻松调整。在实际项目中,还可以结合Spring ...
Spring AOP(面向切面编程)是一个强大的工具,常用于实现业务逻辑中的横切关注点,如日志、事务管理以及我们的案例——数据权限控制。本篇将深入探讨如何结合Spring AOP和Oracle数据库来实现精细化的数据权限控制。...
综上所述,"aop 权限验证demo"提供了一个利用Spring AOP进行权限控制的实例,它展示了如何在不修改业务代码的情况下,通过切面来插入权限检查,提高了代码的整洁性和安全性。通过对不同类型的AOP通知的理解和实践,...
在编程领域,AOP(Aspect-Oriented Programming,面向切面编程)是一种强大的设计模式,它允许程序员将关注点从核心业务逻辑中分离出来,如日志、事务管理、权限控制等。本篇文章将深入探讨如何使用AOP来实现权限...
本实例将深入探讨如何在Spring AOP中实现权限控制,以提高代码的可读性和可维护性。 首先,我们要理解AOP的基本概念。AOP允许程序员定义“切面”,这些切面封装了特定的关注点,比如权限检查。然后,这些切面可以在...
Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改业务代码的情况下,通过代理机制对特定的“切点”(方法、类等)进行增强,实现如日志记录、事务管理、权限控制等功能。在这个示例中,...
在Spring框架中,面向切面编程(AOP)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限控制等,这些关注点可以被模块化并独立于业务逻辑进行处理。本篇文章将深入探讨如何通过Spring的注解...
在这个"struts1+EJB3整合(AOP控制权限)"的项目中,我们看到这两个框架是如何协同工作的,以及如何通过AOP(面向切面编程)来实现权限控制,并使用JUnit进行EJB3的单元测试。 首先,让我们深入理解AOP在权限控制中...
Spring Boot 通过 AOP 和自定义注解实现权限控制的方法 在本文中,我们将探讨如何使用 Spring Boot 通过 Aspect-Oriented Programming(AOP)和自定义注解来实现权限控制。权限控制是任何应用程序的重要组件,它...
在“aop权限代码”这个项目中,我们可以看到如何在Spring 2.5版本中使用AOP来实现权限控制。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点。切面可以包含通知...
面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它将关注点分离,使得系统中的核心业务逻辑与系统级的服务(如日志、事务管理、权限控制等)可以解耦。在.NET平台上实现AOP,我们可以借助于...
总的来说,基于Spring AOP的权限管理系统原型展示了如何利用AOP的`MethodInterceptor`来实现细粒度的权限控制,将权限验证逻辑与业务逻辑分离,使得代码更加模块化和可维护。同时,这种方式也允许我们在不修改业务...