perl: 变量 returns 散列而不是字符串
perl: variable returns hash instead of string
我正在解决与 perl 模块 AuthCASSaml 相关的问题。我们有一个软件,我们想使用我们的 CAS 服务器进行身份验证。身份验证正在工作。但是,当 AuthCASSaml 处理返回的输出时,它最终返回的是 returninf 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;
}
}
"AttributeName" returns 符合预期。问题在于 "AttributeValue"。代码似乎需要一个字符串,但是从 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>
返回的是 "Attributes : uid=>HASH(0x331ecb0), UDC_IDENTIFIER=>HASH(0x331ee90)"。
我还应该注意,我们 运行 的所有代码都是供应商提供的。我不是 perl 程序员。我只是想让一切都一起玩得很好。说来话长,但我只想说供应商在这种情况下没有帮助。
我可以提供 cgi 脚本中的代码进行测试,但主要的软件代码也遇到了这个问题,这就是为什么我很确定 AuthCASSaml.pm 是尝试解决这个问题的地方。
非常感谢任何帮助。
来自我的 to 的相关片段:
This means that you have to perform all kinds of checks to see what you actually got. But the sheer complexity of this encourages developers to make very bad assumptions instead.
看来这正是这里发生的事情。也就是说,您可以使用以下方式访问您想要的数据:
my $av_node = $attr->{'saml1:AttributeValue'};
$casAttrs{$name} = ref($av_node) ? $av_node->{content} : $av_node;
请注意,仍然做出上述的一些假设。
我正在解决与 perl 模块 AuthCASSaml 相关的问题。我们有一个软件,我们想使用我们的 CAS 服务器进行身份验证。身份验证正在工作。但是,当 AuthCASSaml 处理返回的输出时,它最终返回的是 returninf 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;
}
}
"AttributeName" returns 符合预期。问题在于 "AttributeValue"。代码似乎需要一个字符串,但是从 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>
返回的是 "Attributes : uid=>HASH(0x331ecb0), UDC_IDENTIFIER=>HASH(0x331ee90)"。
我还应该注意,我们 运行 的所有代码都是供应商提供的。我不是 perl 程序员。我只是想让一切都一起玩得很好。说来话长,但我只想说供应商在这种情况下没有帮助。
我可以提供 cgi 脚本中的代码进行测试,但主要的软件代码也遇到了这个问题,这就是为什么我很确定 AuthCASSaml.pm 是尝试解决这个问题的地方。
非常感谢任何帮助。
来自我的
This means that you have to perform all kinds of checks to see what you actually got. But the sheer complexity of this encourages developers to make very bad assumptions instead.
看来这正是这里发生的事情。也就是说,您可以使用以下方式访问您想要的数据:
my $av_node = $attr->{'saml1:AttributeValue'};
$casAttrs{$name} = ref($av_node) ? $av_node->{content} : $av_node;
请注意,仍然做出上述的一些假设。