按照说明使用 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 解析和response.rb,我在第 55 行得到了这个:
cas_user = @xml.elements["cas:user"]
cas_user 始终为零,因为 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中。
我正在使用以下内容:
- 导轨 2.3.11
- jRuby 1.6.2 使用解释器版本 1.8
- rubycas 客户端版本 2.3.10.rc1
谢谢你的帮助。