java简单权限管理设计

开发环境

SSM框架,idea

代码结构

在这里插入图片描述

设计思路

可aop代理实现,也可以自定义注解实现,本文介绍自定义注解
实现前提:数据库设计有相关权限码的字段

具体流程

  1. 查数据库获取当前id所有权限码
  2. 把获取的权限码存到session中
  3. 前台根据查权限码session显示想应功能

后台自定义注解设计

  1. 自己定义注解规则
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 "";//自定义方法名
}
  1. 获取有注解的方法并验证当前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;
    }
}
  1. 方法上加上权限
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的权限!!!";
    }

}
  • 此时通过前台访问响应接口时,有权限则响应数据,没权限则报异常

小总结

  • 设计权限首先设计数据库逻辑响应添加权限码字段或者设计中间表等等
  • 自定义权限注解在方法上加上该注解
  • 查询数据库获取权限码列表
  • 获取该方法权限码
  • 验证获取的权限码列表是否包含该方法权限码
  • 包含则响应数据,不包含则抛异常
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值