使用AOP 实现权限控制,通过自定义注解声明业务方法是否需要权限控制,并通过权限注解上的属性声 明需要什么样的权限
时间: 2024-04-11 13:27:10 浏览: 63
在使用AOP实现权限控制时,我们可以通过自定义注解来声明业务方法是否需要权限控制,并通过权限注解上的属性来声明需要什么样的权限。下面是一个示例:
首先,我们定义一个自定义注解 `@RequiresPermission`,用于标识需要进行权限控制的方法:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequiresPermission {
String value(); // 权限名称
}
```
然后,我们创建一个切面类 `PermissionAspect`,用于拦截被 `@RequiresPermission` 注解标识的方法,并进行权限验证:
```java
@Aspect
@Component
public class PermissionAspect {
@Autowired
private PermissionService permissionService; // 权限服务
@Around("@annotation(requiresPermission)")
public Object checkPermission(ProceedingJoinPoint joinPoint, RequiresPermission requiresPermission) throws Throwable {
// 获取当前用户的权限信息
User currentUser = getCurrentUser(); // 自行实现获取当前用户的逻辑
// 根据注解上声明的权限名称,检查当前用户是否具备相应权限
if (currentUser != null && permissionService.hasPermission(currentUser, requiresPermission.value())) {
// 具备权限,继续执行原方法
return joinPoint.proceed();
} else {
// 没有权限,抛出异常或进行其他处理
throw new UnauthorizedException("无权访问该方法");
}
}
}
```
在上述代码中,切面类 `PermissionAspect` 使用了 `@Aspect` 注解,表示它是一个切面类。`@Around("@annotation(requiresPermission)")` 表示拦截被 `@RequiresPermission` 注解标识的方法,并在方法执行前进行权限验证。
在验证权限时,我们可以调用权限服务 `permissionService` 的方法来检查当前用户是否具备相应权限。`getCurrentUser()` 方法用于获取当前用户的信息,你可以根据实际情况自行实现。
最后,我们可以在业务方法上添加 `@RequiresPermission` 注解,并指定需要的权限名称:
```java
@Service
public class UserService {
@RequiresPermission("user:create")
public void createUser(User user) {
// 创建用户
}
@RequiresPermission("user:delete")
public void deleteUser(int userId) {
// 删除用户
}
}
```
在上述示例中,`createUser()` 方法和 `deleteUser()` 方法都添加了 `@RequiresPermission` 注解,并指定了需要的权限名称。在调用这些方法时,切面类 `PermissionAspect` 会拦截并进行权限验证。
这样,我们就可以通过自定义注解声明业务方法是否需要权限控制,并通过权限注解上的属性声明需要什么样的权限。当用户调用这些被标识的方法时,会自动进行权限验证。
阅读全文