perl:变量返回哈希而不是字符串



我正在解决与perl模块AuthCASSaml相关的问题。我们有一个软件,我们想使用我们的CAS服务器进行身份验证。身份验证工作正常。但是,当 AuthCASSaml 处理返回的输出时,它最终会返回 HASH 引用,而不是 CAS 服务器返回的 ldap 属性的实际值。我已将其精确定位到 AuthCASSaml.pm 代码的这一部分:

my $user = $responseBase->{'saml1:Assertion'}{'saml1:AuthenticationStatement'}{'saml1:Subject'}{'saml1:NameIdentifier'};
my %casAttrs;
my $attrs = $responseBase->{'saml1:Assertion'}{'saml1:AttributeStatement'}{'saml1:Attribute'};
if($attrs) {
for(my $i=0;$i<@$attrs;$i++) {
my $attr = $$attrs[$i];
my $name = $attr->{'AttributeName'};
my $value = $attr->{'saml1:AttributeValue'};
$casAttrs{$name} = $value;
}
}

"属性名称"按预期返回。问题出在"属性值"上。代码似乎需要一个字符串,但从 CAS 服务器返回的 "AttributeValue" 的 xml 代码不仅仅是一个简单的字符串。

<saml1:Attribute AttributeName="UDC_IDENTIFIER" AttributeNamespace="http://www.ja-sig.org/products/cas/">
<saml1:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">useriden</saml1:AttributeValue>
</saml1:Attribute>

返回的是"属性:uid=>HASH(0x331ecb0(,UDC_IDENTIFIER=>HASH(0x331ee90("。

我还应该注意,我们运行的所有代码都是供应商提供的。我不是perl程序员。我只是想让所有东西都玩得好。这是一个很长的故事,但我只想说供应商在这种情况下没有帮助。

我可以在 cgi 脚本中提供代码进行测试,但主要软件代码也会遇到此问题,这就是为什么我很确定 AuthCASSaml.pm 是尝试解决此问题的地方。

任何帮助将不胜感激。

我回答为什么 XML::简单不鼓励?的相关片段:

这意味着您必须执行各种检查以查看实际获得的内容。但是,这种复杂性鼓励开发人员做出非常糟糕的假设。

看来这正是这里正在发生的。也就是说,您可以使用以下内容访问所需的数据:

my $av_node = $attr->{'saml1:AttributeValue'};
$casAttrs{$name} = ref($av_node) ? $av_node->{content} : $av_node;

请注意,这仍然做出了上述一些假设。

最新更新