如何角色给菜单增加权限

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

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
下一篇 2024年11月18日 下午7:33

相关推荐

  • 复杂Excel模版定义

    模版示例: Demo Excel样例 代码示例: @Model.model(TestApply.MODEL_MODEL) @Model(displayName = "测试申请") public class TestApply extends IdModel { public static final String MODEL_MODEL …

    2024年11月18日
    35500
  • 如何在代码中使用自增ID和获取序列

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

    2024年5月25日
    1.0K00
  • 代码示例:快速找到示例代码

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

    2024年2月20日
    67200
  • 非存储字段搜索,适应灵活的搜索场景

    1、非存储字段搜索 1.1 描述 通常根据本模型之外的信息作为搜索条件时,通常会把 这些字段放在代理模型上。这类场景我们称之为 非存储字段搜索 1.2 场景一 非存储字段为基本的String。1.代码定义:非存储字段为基本的包装数据类型 @Field(displayName = "确认密码", store = NullableBoolEn…

    2024年2月20日
    67400
  • 后端:如何自定义表达式实现特殊需求?扩展内置函数表达式

    平台提供了很多的表达式,如果这些表达式不满足场景?那我们应该如何新增表达式去满足项目的需求?目前平台支持的表达式内置函数,参考 1. 扩展表达式的场景 注解@Validation的rule字段支持配置表达式校验如果需要判断入参List类型字段中的某一个参数进行NULL校验,发现平台的内置函数不支持该场景的配置,这里就可以通过平台的机制,对内置函数进行扩展。 …

    2024年5月30日
    92400

发表回复

登录后才能评论