角色权限菜单

一、数据库表

在这里插入图片描述

菜单表字段

在这里插入图片描述

二、层级菜单

   @Override
    public PagerBean<MenuBean> findPager(MenuBean menuBean, PagerBean pagerBean) {
        menuBean.setParentCode("0");
        //父节点
        List<MenuBean> menuBeans = this.findAll(menuBean, pagerBean);

        //层级关系
        if (CollectionUtils.isNotEmpty(menuBeans)) {
            for (MenuBean menu : menuBeans) {
                List<MenuBean> childMenu = this.findAll(MenuBean.builder().parentCode(menu.getCode()).build(), pagerBean);

                if (CollectionUtils.isNotEmpty(childMenu)) {
                    menu.setChildMenu(childMenu);

                    for (MenuBean menu2 : childMenu) {
                        List<MenuBean> childMenu2 = this.findAll(MenuBean.builder().parentCode(menu2.getCode()).build(), pagerBean);

                        if (CollectionUtils.isNotEmpty(childMenu2)) {
                            menu2.setChildMenu(childMenu2);
                        }
                    }
                }
            }
        }

        Long count = this.countAll(menuBean, pagerBean.getImpl());
        PagerBean<MenuBean> menuPageBean = new PagerBean<>();
        BeanUtils.copyProperties(pagerBean, menuPageBean);
        menuPageBean.setItemCount(count.intValue());
        menuPageBean.init();
        menuPageBean.setItems(menuBeans);
        return menuPageBean;
    }

三、角色权限菜单

1.权限注解

/**
 * @Author Askin
 * 权限注解
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPermissions {

    String value() default "";
}

2.自定义异常

/**
 * @Author Askin
 */
//更改状态码
@ResponseStatus(HttpStatus.BAD_GATEWAY)
public class CommonException extends RuntimeException {

    //状态码
    private Integer status;

    public CommonException(String message) {
        super(message);
    }

}

3.注解拦截切面

Aop @Aspect资料

package com.askin.menuAuth.corerestful.handler.core;

import com.alibaba.dubbo.common.utils.CollectionUtils;
import com.alibaba.fastjson.JSONObject;
import com.askin.menuAuth.corerestful.annotation.core.CheckPermissions;
import com.askin.menuAuth.coreservice.dao.core.MenuDao;
import com.askin.menuAuth.coreservice.dao.core.RoleMenuDao;
import com.askin.menuAuth.coreservice.dao.core.UserRoleDao;
import com.askin.menuAuth.coreservice.domain.core.Menu;
import com.askin.menuAuth.coreservice.domain.core.RoleMenu;
import com.askin.menuAuth.coreservice.domain.core.UserRole;
import io.github.admin4j.http.util.HttpJsonUtil;
import io.github.admin4j.http.util.HttpUtil;
import okhttp3.Response;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
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 javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Objects;

/**
 * @Author Askin
 */
@Component
//定义切面类
@Aspect
public class CheckPermissionsAspect {

    @Autowired
    MenuDao menuDao;
    @Autowired
    UserRoleDao userRoleDao;
    @Autowired
    RoleMenuDao roleMenuDao;

    //定义切点,切点指定注解
    @Pointcut("@annotation(com.askin.menuAuth.corerestful.annotation.core.CheckPermissions)")
    public void checkPermissions() {
    }

    /**
     * @param joinPoint:JoinPoint为连接点对象, 它可以获取当前切入的方法的参数、代理类等信息,
     *                                   因此可以记录一些信息,验证一些信息等;
     */
    @Before("checkPermissions()")
    public void doBefore(JoinPoint joinPoint) throws RuntimeException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException {
        String userCode = null;

        //拿到方法参数
        Object[] args = joinPoint.getArgs();

        Object parobj = args[0];

        if (!Objects.isNull(parobj)) {
            //Bean
            Class userCla = parobj.getClass();
            //调用Bean.userCode
            Field field = userCla.getDeclaredField("userCode");
            //设置可以访问private变量的变量值
            field.setAccessible(true);
            //获取Bean中的userCode
            userCode = (String) field.get(parobj);
        }
        if (!Objects.isNull(userCode)) {
            //获取方法上有CheckPermissions注解的参数

            //类名
            Class clazz = joinPoint.getTarget().getClass();
            //方法名
            String methodName = joinPoint.getSignature().getName();
            Class[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();
            Method method = clazz.getMethod(methodName, parameterTypes);
            if (method.getAnnotation(CheckPermissions.class) != null) {
                CheckPermissions annotation = method.getAnnotation(CheckPermissions.class);
                //获取注解值
                String menuCode = annotation.value();
                if (StringUtils.isNotBlank(menuCode)) {
                    boolean check = false;

                    List<UserRole> userRoles = userRoleDao.findAllByUserCodeAndValid(userCode, (short) 1);

                    //第一个角色
                    if (CollectionUtils.isNotEmpty(userRoles)) {
                        UserRole userRole = userRoles.get(0);
                        List<RoleMenu> roleMenus = roleMenuDao.findAllByRoleCodeAndValid(userRole.getRoleCode(), (short) 1);
                        if (CollectionUtils.isNotEmpty(roleMenus)) {
                            for (RoleMenu roleMenu : roleMenus) {
                                Menu menu = menuDao.findByCodeAndValid(roleMenu.getMenuCode(), (short) 1);
                                if (menu.getMenuCode().equals(menuCode)) {
                                    check = true;
                                }
                            }
                        }
                    }

                    if (check == false) {
                        throw new CommonException("您没有此权限!");
                    }
                }
            }
        }
    }

}

4.测试匹配menuCode字段是否相等

在这里插入图片描述

5.没有权限响应

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现这个功能的一般步骤如下: 1. 定义菜单数据结构 菜单数据结构应该包含以下信息: - 菜单ID - 菜单名称 - 菜单URL - 父菜单ID - 子菜单列表 可以使用一个类来表示菜单,例如: ``` class Menu { private int id; private String name; private String url; private int parentId; private List<Menu> subMenus; // 省略getter和setter方法 } ``` 2. 定义角色权限数据结构 角色权限数据结构应该包含以下信息: - 角色ID - 角色名称 - 拥有的菜单ID列表 可以使用一个类来表示角色权限,例如: ``` class RolePermission { private int roleId; private String roleName; private List<Integer> menuIds; // 省略getter和setter方法 } ``` 3. 加载菜单角色权限数据 菜单角色权限数据可以从数据库中加载,也可以通过配置文件等其他方式加载。这里假设菜单数据已经加载到了一个列表中,角色权限数据已经加载到了一个Map中(key为角色ID,value为角色权限对象)。 4. 根据角色权限生成菜单 根据角色权限生成菜单的过程可以分为两步: - 根据角色权限过滤菜单列表,得到当前角色拥有的菜单列表。 - 根据拥有的菜单列表生成菜单树。 第一步可以通过遍历菜单列表和角色权限对象的菜单ID列表来实现。例如: ``` List<Menu> filteredMenus = new ArrayList<>(); for (Menu menu : menuList) { if (rolePermission.getMenuIds().contains(menu.getId())) { filteredMenus.add(menu); } } ``` 第二步可以使用递归的方式生成菜单树。例如: ``` public List<Menu> generateMenuTree(List<Menu> menuList, int parentId) { List<Menu> subMenus = new ArrayList<>(); for (Menu menu : menuList) { if (menu.getParentId() == parentId) { menu.setSubMenus(generateMenuTree(menuList, menu.getId())); subMenus.add(menu); } } return subMenus; } ``` 这个方法会递归地生成菜单树。如果某个菜单的父菜单ID等于给定的parentId,则将该菜单加入到父菜单的子菜单列表中,并递归生成该菜单的子菜单列表。 5. 显示菜单 最后,将生成的菜单树显示在页面上即可。可以使用HTML和CSS来实现菜单的样式和交互效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值