Spring Boot教程第27篇:基于AOP实现权限管理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值