开发环境
SSM框架,idea
代码结构
设计思路
可aop代理实现,也可以自定义注解实现,本文介绍自定义注解
实现前提:数据库设计有相关权限码的字段
具体流程
- 查数据库获取当前id所有权限码
- 把获取的权限码存到session中
- 前台根据查权限码session显示想应功能
后台自定义注解设计
- 自己定义注解规则
import org.springframework.web.bind.annotation.Mapping;
import java.lang.annotation.*;
@Target({ElementType.METHOD})//在方法上加上权限注解
@Retention(RetentionPolicy.RUNTIME)//当运行时反射性的读取
@Documented//在类文件里记录
@Mapping
public @interface RequestPermission {//自定义类名
String aclValue() default "";//自定义方法名
}
- 获取有注解的方法并验证当前id是否有该权限
import com.qglt.test.annotation.RequestPermission;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.util.List;
@Component
@Aspect
public class PermissionAdaptor {
//准备session
@Autowired
private HttpSession httpSession;
//通知切入点
@Pointcut("@annotation(com.qglt.test.annotation.RequestPermission)")
public void cut(){}
//环绕切入
@Around("cut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object result = null;
//获取切入点方法签名
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
//获取方法
Method method = methodSignature.getMethod();
//获取方法权限
RequestPermission permission = method.getAnnotation(RequestPermission.class);
//获取方法权限码
String aclValue = permission.aclValue();
//获取session中的权限码
List<String> permissions = (List<String>) httpSession.getAttribute("permissions");
System.out.println("===========");
System.out.println(permissions.toString());
System.out.println("===========");
//验证从session中获取的权限码列表中是否包含当前获取方法的权限码
if (CollectionUtils.isEmpty(permissions)||permissions == null||!permissions.contains(aclValue)){
//没有当前方法权限码则抛运行异常
throw new RuntimeException("没有权限");
}
//有当前方法权限码则继续进行
result = pjp.proceed();
return result;
}
}
- 方法上加上权限
import com.qglt.test.annotation.RequestPermission;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestAnnotationController {
@RequestMapping("annotation")
public String index(){
return "annotation";
}
@RequestPermission(aclValue = "444")
@RequestMapping("annotation01")
@ResponseBody
public String annotationMethod01(){
return "你有annotation01的权限!!!";
}
@RequestPermission(aclValue = "555")
@RequestMapping("annotation02")
@ResponseBody
public String annotationMethod02(){
return "你有annotation02的权限!!!";
}
}
- 此时通过前台访问响应接口时,有权限则响应数据,没权限则报异常
小总结
- 设计权限首先设计数据库逻辑响应添加权限码字段或者设计中间表等等
- 自定义权限注解在方法上加上该注解
- 查询数据库获取权限码列表
- 获取该方法权限码
- 验证获取的权限码列表是否包含该方法权限码
- 包含则响应数据,不包含则抛异常