按照说明使用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 中。
我正在使用以下内容:
谢谢你的帮助。
答案 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发布属性,但网站可以根据需要实现它。