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;
}
}