通过注解/切面方式实现方法权限校验
langu_xyz

AOP是Spring的灵魂

针对于垂直越权以及未授权访问等风险场景,用AOP来做权限校验是个不错的选择,可以使权限校验的代码逻辑更清晰和更具灵活性(就是有时候忘了加注解就很操蛋了,这时候建议在请求入口处做全局基础权限判断来兜底,此处不细讲该方案)。

1. 创建注解

创建注解,注解的作用域是METHOD

假设该权限校验场景下的所有API都需要登陆,那我们这里默认needLogintrue

1
2
3
4
5
6
7
8
@Target({ ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface AutoAuth {

boolean needLogin() default true;
}

2. 实现注解的过滤逻辑

接下来就要开始实现注解的权限校验逻辑了,伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class AutoUserAuthAspect {

public AuthResult checkUser(ProceedingJoinPoint pjp, AutoAuth autoAuth) throws Throwable {
AuthResult result = null;
Throwable error = null;
try {
Object[] args = pjp.getArgs();
if (null == args || args.length == 0) {
return autoAuth.needLogin() ?
“Need login” :
“Error params”;
}
//判断是否登陆
//获取到session/cookie
//解析获得userid
//判断该userid的角色
//判断角色的授权API范围
//返回权限结果 true/false

return result;
}
}

接下来就是通过配置文件将处理逻辑关联到注解上,同时限定有效范围。

application-context.xml

1
2
3
4
5
6
7
8
9
10
<bean id="AutoUserAuthAspect" class=“xxxxx.aspect.AutoUserAuthAspect">
<property name="session" ref="session"/>
</bean>
<aop:config>
<aop:aspect id="autoUserAccess" ref="AutoUserAuthAspect">
<aop:around method="checkUser" pointcut="(execution(* com.xxx.xxx.xxx..*.*(..)))
and
(@annotation(autoAuth))”/>
</aop:aspect>
</aop:config>

3. 使用注解

在入参对象中,将其加到需要过滤的参数上,

1
2
3
4
5
    @AutoAuth
public Result query(){
//业务逻辑
}

  • Post title:通过注解/切面方式实现方法权限校验
  • Post author:langu_xyz
  • Create time:2020-04-10 21:00:00
  • Post link:https://blog.langu.xyz/通过注解切面方式实现方法权限校验/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.