AOP应用之权限管理
在日常开发中,权限管理是必不可少的一项功能。为了避免系统被恶意攻击或者误操作,权限控制必须要做到细致到最小粒度。而AOP则是一种运用非常广泛的技术,可以很好地实现权限管理。
AOP(Aspect-Oriented Programming),即面向切面编程,是一种编程思想。AOP与OOP不同的是,OOP关注的是对象的封装性、继承性和多态性,而AOP关注的是业务逻辑的模块化,通过将逻辑的切面进行分离,然后再通过一个框架将各个切面按顺序组合起来形成完整的业务逻辑。
AOP可以很好地解决横切逻辑问题,例如日志记录、事务处理、异常处理、性能统计等业务流程中经常出现的共性问题。它可以将这些共性问题从业务逻辑中分离出来,做到高内聚、低耦合,并提供更好的代码复用性。
(1)基于注解
通过在方法上添加注解,然后通过AOP拦截特定的注解进行权限控制。例如:
定义注解:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface HasPermission { String value() default ""; }
在需要进行权限控制的方法上添加注解:
@HasPermission("user:add") public void addUser(User user){ // ... }
编写AOP切面:
@Aspect @Component public class PermissionAspect {
@Autowired
private UserService userService;
@Pointcut("@annotation(com.example.permission.HasPermission)")
public void hasPermissionPointcut() {}
@Around("hasPermissionPointcut() && @annotation(permission)")
public Object hasPermission(ProceedingJoinPoint joinPoint, HasPermission permission) throws Throwable {
//获取当前用户的所有权限
List userPermissions = userService.getCurrentUserPermissions();
//检查用户是否具备当前方法的权限
if (userPermissions.contains(permission.value())) {
//拥有权限,执行方法
return joinPoint.proceed();
} else {
//无权限,抛出异常或返回错误信息