如何将很多运行时才获取到的screenIds丢进screenPermissions.explicitPermission中,并让当前user拥有看到这些页面的权限

我想在cuba基础上做一套更易用的权限管理
image
现在遇到的问题是,当我勾选查询复选框时,希望可以拥有当前页面的访问权限,这些页面的screenId是运行时从数据库查询来的,我想尝试用这种方式将获取到的screenIds丢进screenPermissions.explicitPermission中,但是结果screen权限并没有生效,请问该如何让其生效呢?
image
官方配置页面权限的文档如下:
image
但是我的screenIds是运行时获取的,不是写死的,请问该怎么办呢?

关于这一块的描述能再详细一点吗?
image
type=“SCREEN”,target=“sales_Customer.browser” ,这样写表示啥意思,表示screenId=sales_Customer.browser的页面怎么了?

有知道的人可以帮助一下吗??

  • 菜单的加载是通过 MenuConfig Bean 从 xml 中加载。如果菜单要存储在数据库,可以扩展此类,实现从数据库读取的逻辑。
    protected void init() {
        rootItems.clear();

        String configName = AppContext.getProperty(MENU_CONFIG_XML_PROP);

        StringTokenizer tokenizer = new StringTokenizer(configName);
        for (String location : tokenizer.getTokenArray()) {
            Resource resource = resources.getResource(location);
            if (resource.exists()) {
                try (InputStream stream = resource.getInputStream()) {
                    Element rootElement = Dom4j.readDocument(stream).getRootElement();
                    loadMenuItems(rootElement, null);
                } catch (IOException e) {
                    throw new RuntimeException("Unable to read menu config", e);
                }
            } else {
                log.warn("Resource {} not found, ignore it", location);
            }
        }
    }
  • 用户菜单的构建是在 MenuBuilder Bean 中处理的,见其中的 build(AppMenu appMenu, List<MenuItem> rootItems) 方法。这里面主要通过 menuItem.isPermitted(session) 来判断当前用户是否有拥有指定菜单的权限,权限信息是在登录时存储在 UserSession 中的。用户权限的初始化是在 UserSessionManager bean 中处理的,见其中的 compilePermissions(UserSession session, List<Role> roles) 方法,可以覆盖此方法,来实现自定义的权限加载逻辑。

主要从这两 Bean 入手。
另外论坛中也有社区成员实现过类似功能,可以参考下面两个帖子: