【问题标题】:perl: variable returns hash instead of stringperl:变量返回哈希而不是字符串
【发布时间】:2020-04-05 00:36:59
【问题描述】:

我正在解决与 perl 模块 AuthCASSaml 相关的问题。我们有一个软件,我们想使用我们的 CAS 服务器进行身份验证。身份验证正在工作。但是,当 AuthCASSaml 处理返回的输出时,它最终会返回 inf 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”按预期返回。问题在于“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>

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

我还要注意,我们运行的所有代码都是供应商提供的。我不是 perl 程序员。我只是想让所有的东西一起玩得很好。说来话长,但我只想说供应商在这种情况下无济于事。

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

非常感谢任何帮助。

【问题讨论】:

  • 似乎从您的 XML 解析器中掉出的数据不是代码所期望的。这可能有很多原因。如果您无法更改该代码,那么您很可能不走运。恐怕您必须向供应商提供适当的错误报告。
  • 看来the module 使用XML::Simple。这是不应使用 XML::Simple 的原因之一。
  • 是的,它确实使用 XML::Simple 恐怕。该软件的代码非常陈旧。上一次进行任何真正的更新是在 2014 年。如果由我决定,我会扔掉这个软件。不幸的是,这不是我的决定。我很欣赏这些回复,因为它们证实了我对整个代码的一些怀疑。

标签: xml perl cas


【解决方案1】:

从我的answer 到Why is XML::Simple Discouraged? 的相关sn-p:

这意味着您必须执行各种检查才能查看实际得到的结果。但这纯粹的复杂性鼓励开发人员做出非常糟糕的假设。

这似乎正是这里发生的事情。也就是说,您可以使用以下方式访问您想要的数据:

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

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

【讨论】:

  • 这听起来很有用,但恐怕我对 perl 了解的不够多,无法知道如何在我的情况下应用它。你能解释一下我将如何修改我必须这样做的代码吗?我会修改这一行:my $value = $attr-&gt;{'saml1:AttributeValue'}; 吗?
  • 感谢您的澄清。这真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 2014-02-03
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多