如何传递包含@作为参数的用户名
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;
您需要替换主体子句中的相关用户。每个尝试访问的用户都必须访问外部主机/端口。以上是关于如何传递包含@作为参数的用户名的主要内容,如果未能解决你的问题,请参考以下文章
在 ApiController 操作中获取当前用户,而不将用户 ID 作为参数传递
JSESSIONID 是如何传递的?作为标头参数还是作为 cookie 参数?
如何在运行Jenkins CI管道时屏蔽作为用户输入传递的密码?