rubycas-client XML解析

时间:2013-09-12 11:30:50

标签: ruby-on-rails xml jruby cas rubycas-client

按照说明使用CAS-client时,我已经达到了外部CAS服务器得到肯定响应的程度:

CAS server responded with #<Net::HTTPOK 200 OK readbody=true>:

XML就像这样:

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
  <cas:authenticationSuccess>
    <cas:attributes>
      <cas:user>4oaz8QMucIrlFOU7dr3QpWkqbRY=</cas:user>
      <cas:ccc></cas:ccc>
      <cas:tipo>EDITED_OUT</cas:tipo>
      <cas:acceso>cd</cas:acceso>
      <cas:identificador>EDITED_OUT</cas:identificador>
      <cas:txtBienvenida>EDITED_OUT</cas:txtBienvenida>
      <cas:usuarioValidado>S</cas:usuarioValidado>
      <cas:correo>EDITED_OUT</cas:correo>
      <cas:tlf>EDITED_OUT</cas:tlf>
      <cas:tipoAcceso>2</cas:tipoAcceso>
      <cas:xusuario>EDITED_OUT</cas:xusuario>
      <!-- En caso de que el usuario disponga de certificado digital -->

      <cas:nif>EDITED_OUT</cas:nif>
      <cas:email>EDITED_OUT</cas:email>
      <cas:apellido1>EDITED_OUT</cas:apellido1>
      <cas:apellido2>EDITED_OUT</cas:apellido2>
      <cas:anagramaFiscal>EDITED_OUT</cas:anagramaFiscal>
      <cas:nombre>EDITED_OUT</cas:nombre>

      <!-- Faltan las fechas -->

      <cas:tipoCertificado>EDITED_OUT</cas:tipoCertificado>
      <cas:emisor>EDITED_OUT</cas:emisor>
      <cas:usoCertificado>EDITED_OUT</cas:usoCertificado>
      <cas:apellidosResponsable>EDITED_OUT</cas:apellidosResponsable>

      <!-- Faltan las fechas -->

      <cas:politica>1.3.6.1.4.1.5734.3.5</cas:politica>
      <cas:subject>EDITED_OUT</cas:subject>
      <cas:versionPolitica>45</cas:versionPolitica>
      <cas:organizacionEmisora>FNMT</cas:organizacionEmisora>
      <cas:idPolitica>DEFAULT</cas:idPolitica>
      <cas:numSerie>EDITED_OUT</cas:numSerie>
      <cas:clasificacion>FNMT</cas:clasificacion>
      <cas:tipoAfirma>0</cas:tipoAfirma>
    </cas:attributes>
  </cas:authenticationSuccess>
</cas:serviceResponse>

然后我从rubycas-client获取此日志消息:

Ticket "EDITED_OUT" for service "EDITED_OUT" belonging to user nil is VALID.

然后这个错误转储:

TypeError (can't dup NilClass):
  org/jruby/RubyKernel.java:1894:in `dup'
  ----CUTTED----

检查代码,我得出的结论是错误在 filter.rb 第64行:

controller.session[client.username_session_key] = st.user.dup

调试,我检查了 st 对象的内容:

(rdb:2) st.is_valid?
true
(rdb:2) st.user
nil
(rdb:2) st
#<CASClient::ServiceTicket:0x7e054262
  @renew=nil,
  @extra_attributes={
    "user"=>"4oaz8QMucIrlFOU7dr3QpWkqbRY="
    "ccc"=>nil,
    "tipo"=>"CIUDADANO",
    "acceso"=>"cd",
    "identificador"=>"EDITED_OUT",
    "txtBienvenida"=>"EDITED_OUT",
    "usuarioValidado"=>"S", 
    "correo"=>"EDITED_OUT",
    "tlf"=>"EDITED_OUT",
    "tipoAcceso"=>"2",
    "xusuario"=>"EDITED_OUT",
    "nif"=>"EDITED_OUT", 
    "email"=>"EDITED_OUT",
    "apellido1"=>"EDITED_OUT",
    "apellido2"=>"EDITED_OUT",      
    "anagramaFiscal"=>"EDITED_OUT",         
    "nombre"=>"EDITED_OUT",
    "tipoCertificado"=>"FNMT PF",       
    "emisor"=>"EDITED_OUT",
    "usoCertificado"=>"EDITED_OUT",
    "apellidosResponsable"=>"EDITED_OUT",
    "politica"=>"1.3.6.1.4.1.5734.3.5",
    "subject"=>"EDITED_OUT",
    "versionPolitica"=>"45",
    "organizacionEmisora"=>"FNMT",
    "idPolitica"=>"DEFAULT",
    "numSerie"=>"EDITED_OUT",
    "clasificacion"=>"FNMT",
    "tipoAfirma"=>"0"
  },
  @service="EDITED_OUT",
  @failure_code=nil,
  @ticket="EDITED_OUT",
  @pgt_iou=nil,
  @user=nil,
  @failure_message=nil,
  @success=true
>

然后,研究xml解析和 respond.rb ,我在第55行到达了这一点:

cas_user = @xml.elements["cas:user"]

cas_user始终为nil,因为XML根目录中没有 cas:user 元素,但是有一个作为 cas:attributes 的子元素,因此:

@xml.elements["cas:attributes/cas:user"]
在我的情况下,

返回一些看起来像某种摘要的东西,虽然我不知道它是如何编码的或者有什么信息。

我的问题是,如果 cas:attributes / cas:user 属性是客户端尝试从XML解析的属性,或者是否是其他内容。另外,我想知道上面粘贴的XML格式是否符合CAS-2.0协议,或者错误是否来自格式错误的XML。很奇怪,rubycas-client将所有“有用数据”存储在 extra_attributes 中。

我正在使用以下内容:

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

cas:user是响应中返回的netid / principal名称。您的cas:user输出让我认为CAS服务器正在使用OAUTH提供程序。 CAS还支持匿名特定服务的用户名属性,以便只保证服务获取每个实例的用户名。它可以在服务注册表中选择(de)。

CAS 2.0协议不正式支持属性释放;只有SAML 1.1协议正式支持它。 (即将到来的CAS 3.0客户端将正式支持属性发布。)许多网站实现了一个简单的modification,允许CAS 2.0发布属性,但网站可以根据需要实现它。