自定义注解+反射实现角色用户权限到参数层级的控制

2023年初接到这个项目,是某个大型项目的子项目。项目做到一半,客户要求不用大项目的登录,我们子项目自己实现登录及权限控制。目前已经实现了用户角色权限的控制。所以上来比比一下。废话不多说,开始啦!

一 自定义注解的实现

我想用一个自己写的注解,在已有的接口上加上后就能控制,当前登录用户是否有权限访问这个接口。第一步,我写的自定义注解@PreAuth.

import java.lang.annotation.*;

@Taraget(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface PreAuth{

String menu() default "";//菜单权限

String operate() default "";//操作按钮权限 }

2.接下来就是他的AOP实现啦,上干货。

@Slf4j

@Component

@Aspect

public class PreAuthAop{

@Atuowired

public HttpServletRequest request;

@Autowired

protected RedisTemplate redis;

@Pointcut("@annotation(com.server.auth.PreAuth)")

public void callFatherPointCut(){ }

@Around("callFatherPointCut")

public Object authHander(ProceedingJoinPoint point) throws Throwable{

//通过反射获取方法名称 与入参参数

Class<?> aClass = point.getTarget.getClass();

MethodSignature ms = (MethodSignature)point.getSignature();

Method method = aClass.getDeclaredMethod(ms.getName,ms.getParamterTypes());

PreAuth annotation=method.getAnnotation(PreAuth.class);

//获取自定义注解中定义的菜单

String menu = annotation.menu();

//获取自定义注解中定义的操作按钮

String operate=annotation.operate();

//获取请求头的token 主要用户获取当前用户信息 查询给其配置了哪些角色

String token =request.getHeader("token");

//已经有登录token 相信你自己能获取登录用户信息

//下一行为伪代码 假如你已经获取用户信息

UserVo user=redis.get(token);

//用户关联用户角色表 角色表关联角色权限表 查询出当前用户的权限

UserAuth userAuth //为你获取的当前对象的权限

if(!userAuth.contains(menu)){

throw new RuntimeException("无菜单权限");

}

if(!userAuth.contains(operate)){

throw new RuntimeException("无操作按钮权限");

}

//前端入参校验 有时会一个接口多用 但是接口的入参不同 此时我们可以获取不同的入参来判断是那种业务请求

Map<String,Object> objectMap=getFieldName(point);

需要的类型 = (强转类型)objectMap.get("data");

//再进行业务判断 是否抛对应错误

//继续执行

Object o=point.proceed(point.getArgs());

return 0;

}

//获取加了自定义注解的接口 入参

private static Map<String.Object> getFieldName(ProceedingJoinPoint joinPoint){

Object[] args=joinPpoint.getArgs();

ParameterNameDiscover pnd =new DefaultParameterNameDiscoverer();

MethodSignature signature=(MethodSignature)joinPoint.getSignature();

Method method=signature.getMethod();

String[] parameterNames=pnd.getParameterNames(method);

Map<String,Object> parmMap=new HashMap<>(32);

for(int i =0;i<parameterNames.length;i++){

parmMap.put(paramteterNames[i],args[i]);

}

return parmMap;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值