SpringBoot使用AOP+注解实现简单的权限验证的方法
程序员文章站
2024-02-22 15:59:34
springaop的介绍:
demo介绍
主要通过自定义注解,使用springaop的环绕通知拦截请求,判断该方法是否有自定义注解,然后判断该用户是否有该权限。这里...
springaop的介绍:
demo介绍
主要通过自定义注解,使用springaop的环绕通知拦截请求,判断该方法是否有自定义注解,然后判断该用户是否有该权限。这里做的比较简单,只有两个权限:一个普通用户、一个管理员。
项目搭建
这里是基于springboot的,对于springboot项目的搭建就不说了。在项目中添加aop的依赖:<!--more--->
<!--aop包--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-aop</artifactid> </dependency>
自定义注解及解析
在方法上添加该注解,说明该方法需要管理员权限才能访问。
@target(elementtype.method) @retention(retentionpolicy.runtime) @documented public @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 @component public 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既可
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。