如何传递包含@作为参数的用户名

Posted

技术标签:

【中文标题】如何传递包含@作为参数的用户名【英文标题】:How to pass a username containing @ as a parameter 【发布时间】:2019-09-18 07:31:58 【问题描述】:

我正在尝试在 Oracle 数据库中为来自 PL/SQL 的 REST API 调用开放,为此,我需要我的用户能够执行网络调用。

经过一番研究,我相信以下方法应该可行:

BEGIN
    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => '*',
        ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                           principal_name => 'my-user@my-domain',
                           principal_type => xs_acl.ptype_db));
END;

...而且它似乎只要my-user 是一个单一的/简单的名称,例如'my-user';尝试将其应用于包含@ 的用户名时会出现问题,如上例所示。

在这种情况下,我会收到错误:

ORA-44003: 无效的 SQL 名称

将用户名中包含@ 的用户与不包含用户名的用户进行比较时,我可以看到的唯一明显区别是前者有Authentication Type = EXTERNAL,而后者有Authentication Type = PASSWORD,但我不明白为什么这应该很重要。

在我看来,这可能是一个与语法相关的问题 - 任何人都可以确认或否认这一点,并指出在这种情况下传递 principal 参数的正确方法吗?

【问题讨论】:

【参考方案1】:

主体始终是数据库用户,因此无论如何它的名称中都不能有@。您需要指定将代表最终用户执行 REST 调用的数据库用户。

【讨论】:

感谢您的意见。不过,我发现这有点令人困惑:当我尝试使用 @-user 运行 http 查询时,出现错误:“网络访问被访问控制列表 (ACL) 拒绝 ”。这是我之前为其他用户遇到的相同错误,该用户现在可以访问。那么有限的访问权限是否与@-user 无关?如果@-user 的查询实际上是由另一个用户运行的,那么我如何识别是哪个用户? 不确定 - 也许 REST 调用正在由 ORDS 帐户执行? ACL 问题可以这样调试:with aclprivs as ( select P.principal, N.acl, P.privilege, P.is_grant, P.invert, N.host, N.lower_port, N .upper_port, X.shared, X.security_class_name, X.security_class_ns, X.description from dba_network_acl_privileges P, dba_network_acls N, xds_acl x where P.aclid = N.aclid and N.aclid = X.aclid(+) ) select * from aclprivs where principal = '...user...' order by acl, privilege; 您需要替换主体子句中的相关用户。每个尝试访问的用户都必须访问外部主机/端口。

以上是关于如何传递包含@作为参数的用户名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 上传递带有感叹号的参数?

在 ApiController 操作中获取当前用户,而不将用户 ID 作为参数传递

JSESSIONID 是如何传递的?作为标头参数还是作为 cookie 参数?

如何在运行Jenkins CI管道时屏蔽作为用户输入传递的密码?

如何将参数从Selenium Webdriver传递给JMeter?

如何通过扫描仪将 LocalDate 类型作为参数传递?