Spring Boot教程第27篇:基于AOP实现权限管理
1.引入依赖
<!--AOP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--AOP-->
2.创建一个AuthToken注解类
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthToken {
String[] roleName() default "";
}
/** @TARGET:
** 用于标注这个注解放在什么地方,类上,方法上,构造器上
* * ElementType.METHOD 用于描述方法
* * ElementType.FIELD 用于描述成员变量,对象,属性(包括enum*实例)
* * ElementType.LOCAL_VARIABLE 用于描述局部变量
* * ElementType.CONSTRUCTOR 用于描述构造器
* * ElementType.PACKAGE 用于描述包
* * ElementType.PARAMETER 用于描述参数
* * ElementType.TYPE 用于描述类,接口,包括(包括注解类型)* 或enum声明
*
*@Retention:
* 用于说明这个注解的生命周期
* * RetentionPolicy.RUNTIME 始终不会丢弃,运行期也保留该注解。因此可以使用反射机制来读取该注解信息。
* * 我们自定义的注解通常用这种方式
* * RetentionPolicy.CLASS 在类加载的时候丢弃,在字节码文件的 *处理中有用。注解默认使用这种方式
* * RetentionPolicy.SOURCE 在编译阶段丢弃,这些注解在编译结束后就不再有任何意义,所以他们不会写入字节码中
* * @Override,@SuppressWarnings都属于这类注解。
* * 我们自定义使用中一般使用第一种
* * java过程为 编译-加载-运行
*
*@Documented
* * 将注解信息添加到文本中
*/
3.创建一个AuthTokenAspect类
@Aspect //表明是一个注解
@Component //让spring托管
public class AuthTokenAspect {
@Around(“@annotation(AuthToken)”)
public Object doAnnotation(ProceedingJoinPoint pjp) throws Throwable {
System.out.print("方法执行前");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String token = request.getParameter("token");
String role = request.getParameter("role");
MethodSignature methodSignature = (MethodSignature)pjp.getSignature();
String[] roleName = methodSignature.getMethod().getAnnotation(AuthToken.class).roleName();
if (roleName.length == 1) {
if (token.equals("") || token == null) {
return "需要登录后才能访问";
}
return pjp.proceed();
} else {
for (String str : roleName) {
if (str.equals(role)) {
return pjp.proceed();
}
}
}
return "匹配的权限不对!";
}
}
4.测试
@RestController
public class UserController {
@GetMapping("hello")
public String hello(String token) {
System.out.println("hello方法执行:token==>"+token);
return "hi~ 我不需要用户权限";
}
@GetMapping("user")
@AuthToken
public String user(String token) {
System.out.println("user方法执行:token==>" + token);
return "hi~ 我需要登陆后才可以访问";
}
@GetMapping("admin")
@AuthToken(roleName = {"admin","user"})
public String admin(String token, String role) {
System.out.println("admin方法执行:id==>" + token + ",role==>" + role );
return "hi~ 我需要管理员身份才可以访问";
}
}
源码地址 git@gitee.com:zhu_can/AopLearn.git