博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot使用AOP+注解实现简单的权限验证
阅读量:7078 次
发布时间:2019-06-28

本文共 2373 字,大约阅读时间需要 7 分钟。

SpringAOP的介绍:

demo介绍

主要通过自定义注解,使用SpringAOP的环绕通知拦截请求,判断该方法是否有自定义注解,然后判断该用户是否有该权限。这里做的比较简单,只有两个权限:一个普通用户、一个管理员。

项目搭建

这里是基于SpringBoot的,对于SpringBoot项目的搭建就不说了。在项目中添加AOP的依赖:<!--more--->

org.springframework.boot
spring-boot-starter-aop

自定义注解及解析

在方法上添加该注解,说明该方法需要管理员权限才能访问。

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Permission {      String authorities() default "ADMIN";}

解析类:通过AOP的环绕通知获取方法上的注解,判断是否有Permission注解,返回注解的值。

public class AnnotationParse {    /***     * 解析权限注解     * @return 返回注解的authorities值     * @throws Exception     */    public static String privilegeParse(Method method) throws Exception {        //获取该方法        if(method.isAnnotationPresent(Permission.class)){            Permission annotation = method.getAnnotation(Permission.class);            return annotation.authorities();        }        return null;    }}

SpringAOP环绕通知

@Aspect@Componentpublic class ControllerAspect {    private final static Logger logger = LoggerFactory.getLogger(ControllerAspect.class);    @Autowired    private UserService userService;    /**     * 定义切点     */    @Pointcut("execution(public * com.wqh.blog.controller.*.*(..))")    public void privilege(){}    /**     * 权限环绕通知     * @param joinPoint     * @throws Throwable     */    @ResponseBody    @Around("privilege()")    public Object isAccessMethod(ProceedingJoinPoint joinPoint) throws Throwable {        //获取访问目标方法        MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();        Method targetMethod = methodSignature.getMethod();        //得到方法的访问权限        final String methodAccess = AnnotationParse.privilegeParse(targetMethod);        //如果该方法上没有权限注解,直接调用目标方法        if(StringUtils.isBlank(methodAccess)){            return joinPoint.proceed();        }else {            //获取当前用户的权限,这里是自定义的发那个发            User currentUser = userService.getCurrentUser();            logger.info("访问用户,{}",currentUser.toString());            if(currentUser == null){                throw new LoginException(ResultEnum.LOGIN_ERROR);            }            if(methodAccess.equals(currentUser.getRole().toString())){               return joinPoint.proceed();            }else {                throw new BusinessException(ResultEnum.ROLE_ERROR);            }        }    }}

使用

只需要在需要验证的方法上添加自定义注解: @Permission既可

转载地址:http://invml.baihongyu.com/

你可能感兴趣的文章
实战CentOS系统部署Hadoop集群服务
查看>>
前端之viewport
查看>>
更改pip源
查看>>
Bring up initerface eth0:Error:Connection acctivation filaed :Device not managed by NetworkManager
查看>>
ESX3.5 安装
查看>>
大端小端-字节存储顺序
查看>>
病毒2
查看>>
memcache 未授权访问漏洞
查看>>
Skype for Business Server 2015 共享PPT、白板、投票错误
查看>>
【OSC手机App技术解析】- 集成新浪微博Android SDK
查看>>
Maven常用命令及在Eclipse中的应用
查看>>
我的友情链接
查看>>
html5+判断app网络是否连接
查看>>
SQL连接查询1 内联接查询
查看>>
mysql5.7主主(双主)复制
查看>>
我的友情链接
查看>>
两阶段提交的工程实践
查看>>
如何搞定tomcat这只喵~
查看>>
Python Django POST Forbidden (403) - CSRF cooki...
查看>>
date 命令详解
查看>>