SpringAOP+自定义注解模拟shiro框架实现
时间: 2023-12-21 13:03:30 浏览: 181
首先,我们需要定义一个自定义注解 `@RequiresPermissions`,用于标识需要授权访问的方法,例如:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequiresPermissions {
String[] value(); // 权限值
}
```
然后,我们需要实现一个切面,用于拦截被 `@RequiresPermissions` 标识的方法,并进行权限校验,例如:
```java
@Component
@Aspect
public class PermissionCheckAspect {
@Autowired
private AuthService authService;
@Around("@annotation(requiresPermissions)")
public Object checkPermission(ProceedingJoinPoint joinPoint, RequiresPermissions requiresPermissions) throws Throwable {
// 获取当前用户
User user = authService.getCurrentUser();
if (user == null) {
throw new UnauthorizedException("用户未登录");
}
// 获取当前用户的权限列表
List<String> permissions = authService.getUserPermissions(user);
// 校验权限
for (String permission : requiresPermissions.value()) {
if (!permissions.contains(permission)) {
throw new ForbiddenException("没有访问权限:" + permission);
}
}
// 执行目标方法
return joinPoint.proceed();
}
}
```
在切面中,我们首先通过 `AuthService` 获取当前用户及其权限列表,然后校验当前用户是否拥有被 `@RequiresPermissions` 标识的方法所需的所有权限,如果没有则抛出 `ForbiddenException` 异常,如果有则继续执行目标方法。
最后,我们需要在 Spring 配置文件中启用 AOP 自动代理,并扫描切面所在的包,例如:
```xml
<aop:aspectj-autoproxy />
<context:component-scan base-package="com.example.aspect" />
```
这样,我们就通过 Spring AOP 和自定义注解模拟实现了类似 Shiro 权限校验的功能。
阅读全文