如何角色给菜单增加权限

对接第三方的权限时,第三方传过来菜单项,需要拿着这些菜单在平台这边进行授权,可以使用代码的方式给指定菜单创建权限
代码示例:

public class demo {

    @Autowired
    private PermissionNodeLoader permissionNodeLoader;

    @Autowired
    private AuthRbacRolePermissionServiceImpl authRbacRolePermissionService;

    public void roleAuthorization() {
        ArrayList<Menu> menus = new ArrayList<>();
        menus.add(new Menu().queryOneByWrapper(Pops.<Menu>lambdaQuery()
                .from(Menu.MODEL_MODEL)
                .eq(Menu::getName, "uiMenu90dd10ae7cc4459bacd2845754b658a8")
                .eq(Menu::getModule, TopModule.MODULE_MODULE)));
        menus.add(new Menu().queryOneByWrapper(Pops.<Menu>lambdaQuery()
                .from(Menu.MODEL_MODEL)
                .eq(Menu::getName, "TopMenus_shoppMenu_Shop3Menu_ShopSayHello52eMenu")
                .eq(Menu::getModule, TopModule.MODULE_MODULE)));

        //加载指定角色的全部资源权限项
        ResourcePermissionNodeLoader loader = permissionNodeLoader.getManagementLoader();
        List<PermissionNode> nodes = loader.buildRootPermissions();
        List<AuthRbacResourcePermissionItem> authRbacRolePermissionProxies = new ArrayList<>();

        //给指定角色创建权限,如果需要多个角色,可以for循环依次执行authRbacRolePermissionService.update(authRbacRolePermissionProxy)
        AuthRole authRole = new AuthRole().queryOneByWrapper(Pops.<AuthRole>lambdaQuery()
                .from(AuthRole.MODEL_MODEL)
                .eq(AuthRole::getCode, "R003")
                .eq(AuthRole::getName, "R003"));
        AuthRbacRolePermissionProxy authRbacRolePermissionProxy = new AuthRbacRolePermissionProxy();
        AuthRole.transfer(authRole, authRbacRolePermissionProxy);

        for (PermissionNode node : nodes) {
            traverse(node, authRbacRolePermissionProxies, menus);
        }
        authRbacRolePermissionProxy.setResourcePermissions(authRbacRolePermissionProxies);

        authRbacRolePermissionService.update(authRbacRolePermissionProxy);

    }

    private void traverse(PermissionNode node, List<AuthRbacResourcePermissionItem> authRbacRolePermissionProxies, ArrayList<Menu> menus) {
        if (node == null) {
            return;
        }
        //按照指定菜单进行过滤,如果不是指定菜单,则设置菜单项不可访问,如果是指定菜单,则设置可访问
        Set<Long> menuIds = new HashSet<>();
        for (Menu menu : menus) {
            menuIds.add(menu.getId());
        }
        if (node instanceof MenuPermissionNode) {
            AuthRbacResourcePermissionItem item = new AuthRbacResourcePermissionItem();
            if (menuIds.contains(Long.parseLong(node.getId()))) {
                item.setCanAccess(Boolean.TRUE);
            } else {
                item.setCanAccess(Boolean.FALSE);
            }
            item.setCanManagement(node.getCanManagement());
            item.setPath(node.getPath());
            item.setSubtype(node.getNodeType());
            item.setType(AuthEnumerationHelper.getResourceType(node.getNodeType()));
            item.setDisplayName(node.getDisplayValue());
            item.setResourceId(node.getResourceId());
            authRbacRolePermissionProxies.add(item);
        }
        List<PermissionNode> childNodes = node.getNodes();
        if (CollectionUtils.isNotEmpty(childNodes)) {
            for (PermissionNode child : childNodes) {
                traverse(child, authRbacRolePermissionProxies, menus);
            }
        }
    }
}

执行看效果
如何角色给菜单增加权限

Oinone社区 作者:yexiu原创文章,如若转载,请注明出处:https://doc.oinone.top/dai-ma-shi-jian/19329.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(0)
yexiu的头像yexiu数式员工
上一篇 2024年11月12日 下午7:29
下一篇 2天前

相关推荐

  • 如何改变调度策略,让Schedule独立执行线程

    1、后台创建task type相关的类,继承BaseScheduleNoTransactionTask,要加springbean的注解,参考:task type建议使用类名 2、提交任务的时候,设置tasktype为步骤1的TaskType 3、控制台新增策略和任务bean名称为步骤1的spring beanName,任务名称 $xxx,右边的占位符内容为y…

    2024年2月20日
    40900
  • 如何把平台功能菜单加到项目中?

    概述 在使用Oinone低代码平台进行项目开发的过程中,会存在把平台默认提供的菜单加到自己的项目中。这篇文章介绍实现方式,以角色管理为例。 1. 低代码情况 即项目是通过后端代码初始化菜单的方式。 通常在 XXXMenu.java类通过@UxMenu注解的方式,代码片段如下: 此种情况与添加项目本地的菜单无区别,具体代码: @UxMenu(value = &…

    2024年4月19日
    82000
  • 左树右表,支撑不同场景的树表结构

    左树右表俩种情况 假设存在 A模型 B模型 1: 左树为A模型,右表为B模型 举例 A模型为类目 B模型为类目属性模型代码实例: @Model.model(AriesPlatformCategory.MODEL_MODEL) @Model(displayName = "平台后台类目", labelFields = "name&q…

    2024年2月20日
    80900
  • 代码示例:快速找到示例代码

    1、图表设计器 数据可视化能加载到的接口,方法上需要加 category = FunctionCategoryEnum.QUERY_PAGE @Model.model(ExpensesIncome.MODEL_MODEL) @Component @Slf4j public class ExpensesIncomeAction { @Function.Adva…

    2024年2月20日
    59000
  • 如何在代码中使用自增ID和获取序列

    在使用继承IDModel或CodeModel时,id和code是系统默认自动生成, 默认值规则:ID–>分布式ID; CODE–>根据定义的SequenceConfig规则自动生成。 在特定情况下需要落库前先生成ID或者Code,这些场景下可参照如下代码示例 一、使用自增ID 单个字段设置方式 // 主键字段,可以使用mysql的自增能力 @…

    2024年5月25日
    83600

发表回复

登录后才能评论