You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Milo Server中设置文件夹可见性与方法访问权限?

解决Milo OPC UA Server中文件夹可见性与方法调用权限的限制问题

你用的RestrictedAccessFilter只针对变量节点的读写访问生效,文件夹的可见性控制、方法的调用权限需要用Milo提供的其他过滤器链来实现,具体方案如下:

一、限制特定用户对文件夹的可见性

文件夹的可见性是在浏览(Browse)阶段控制的,需要给目标文件夹节点添加BrowseFilter,在浏览请求中根据用户身份过滤掉该节点:

// 假设folderNode是你要限制的文件夹节点实例
folderNode.getBrowseFilterChain().addLast(new BrowseFilter() {
    @Override
    public void apply(BrowseContext context, List<ReferenceDescription> references) {
        // 获取当前会话的用户身份
        String identity = (String) context.getSession().getIdentityObject();
        
        // 仅对guest用户隐藏该文件夹:移除指向当前文件夹的引用
        references.removeIf(ref -> 
            ref.getNodeId().equals(folderNode.getNodeId()) && "guest".equals(identity)
        );
    }
});

如果需要批量控制子节点的可见性,也可以在过滤器中遍历references,根据节点类型或ID批量过滤。

二、限制特定用户对方法的使用权限

方法的调用权限需要通过CallFilterChain添加验证逻辑,在方法被调用前检查用户身份,不满足条件则抛出权限拒绝异常:

// 假设methodNode是你要限制的方法节点实例
methodNode.getCallFilterChain().addLast(new CallFilter() {
    @Override
    public void apply(CallContext context) throws UaException {
        String identity = (String) context.getSession().getIdentityObject();
        
        // 仅允许admin用户调用该方法
        if (!"admin".equals(identity)) {
            throw new UaException(StatusCode.BAD_USER_ACCESS_DENIED);
        }
    }
});

补充说明

  1. 如果你的身份验证不是简单的字符串用户名(比如用X509证书),需要调整getIdentityObject()的类型转换逻辑,比如强转为X509Certificate后提取用户信息。
  2. 文件夹的可见性也可以通过设置节点的AccessRestrictions属性,但BrowseFilter的方式更灵活,能针对单个节点做精细化控制。
  3. 方法的CallFilter支持更复杂的验证逻辑,比如结合用户角色、调用参数做权限判断。

内容的提问来源于stack exchange,提问作者Thomas Liné

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:03:28