You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grails 3.3.2集成Spring Security CAS登录遇XML解析错误求助

Grails 3.3.2 CAS登录出现"Premature end of file"异常的排查与解决建议

我来帮你分析这个Grails 3.3.2对接CAS时遇到的XML解析异常问题,结合你提供的日志和版本差异,给你梳理排查思路和解决建议:

问题背景

在Grails 3.3.2应用中,使用CAS登录时输入用户名密码后触发Premature end of file XML解析异常,但相同应用在Grails 2.5.1版本对接同一CAS服务器可正常运行。

Grails 3.3.2错误日志

Configuring Spring Security Core ... ... finished configuring Spring Security Core Configuring Spring Security CAS ... ... finished configuring Spring Security CAS Grails application running at http://localhost:8089 in environment: development 2018-05-22 13:59:47.395 DEBUG --- [nio-8089-exec-2] o.j.c.c.session.SingleSignOutHandler : Recording session for token ST-1553-4NR7XWRPXGioiJXs9oLd-cas-01.mydomain.com 2018-05-22 13:59:47.395 DEBUG --- [nio-8089-exec-2] o.j.c.c.session.SingleSignOutHandler : Recording session for token ST-1553-4NR7XWRPXGioiJXs9oLd-cas-01.mydomain.com 2018-05-22 13:59:47.425 DEBUG --- [nio-8089-exec-2] c.c.s.HashMapBackedSessionMappingStorage : Attempting to remove Session=[7CBCC94E9BF728A044B05C07ABFAB894] 2018-05-22 13:59:47.425 DEBUG --- [nio-8089-exec-2] c.c.s.HashMapBackedSessionMappingStorage : Attempting to remove Session=[7CBCC94E9BF728A044B05C07ABFAB894] 2018-05-22 13:59:47.425 DEBUG --- [nio-8089-exec-2] c.c.s.HashMapBackedSessionMappingStorage : No mapping for session found. Ignoring. 2018-05-22 13:59:47.425 DEBUG --- [nio-8089-exec-2] c.c.s.HashMapBackedSessionMappingStorage : No mapping for session found. Ignoring. 2018-05-22 13:59:47.440 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Placing URL parameters in map. 2018-05-22 13:59:47.440 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Placing URL parameters in map. 2018-05-22 13:59:47.441 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Calling template URL attribute map. 2018-05-22 13:59:47.441 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Calling template URL attribute map. 2018-05-22 13:59:47.441 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Loading custom parameters from configuration. 2018-05-22 13:59:47.441 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Loading custom parameters from configuration. 2018-05-22 13:59:47.442 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Constructing validation url: https://cas.mydomain.com/cas/serviceValidate?pgtUrl=http%3A%2F%2Flocalhost%3A8089%2Fsecure%2Freceptor&ticket=ST-1553-4NR7XWRPXGioiJXs9oLd-cas-01.mydomain.com&service=http%3A%2F%2Flocalhost%3A8089%2Flogin%2Fcas 2018-05-22 13:59:47.442 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Constructing validation url: https://cas.mydomain.com/cas/serviceValidate?pgtUrl=http%3A%2F%2Flocalhost%3A8089%2Fsecure%2Freceptor&ticket=ST-1553-4NR7XWRPXGioiJXs9oLd-cas-01.mydomain.com&service=http%3A%2F%2Flocalhost%3A8089%2Flogin%2Fcas 2018-05-22 13:59:47.442 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Retrieving response from server. 2018-05-22 13:59:47.442 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Retrieving response from server. 2018-05-22 13:59:48.864 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Server response: 2018-05-22 13:59:48.864 DEBUG --- [nio-8089-exec-2] o.j.c.c.v.Cas20ServiceTicketValidator : Server response: 2018-05-22 13:59:49.334 ERROR --- [nio-8089-exec-2] org.jasig.cas.client.util.XmlUtils : Premature end of file. org.xml.sax.SAXParseException: Premature end of file. at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.jasig.cas.client.util.XmlUtils.getTextForElement(XmlUtils.java:192) serverUrlPrefix = 'http://cas.mydomain.com/cas'

Grails 2.5.1正常日志片段

2018-05-18 10:42:26,755 DEBUG AbstractUrlBasedTicketValidator - Placing URL parameters in map. 2018-05-18 10:42:26,755 DEBUG AbstractUrlBasedTicketValidator - Calling template URL attribute map. 2018-05-18 10:42:26,756 DEBUG AbstractUrlBasedTicketValidator - Loading custom parameters from configuration. 2018-05-18 10:42:26,756 DEBUG AbstractUrlBasedTicketValidator - Constructing validation url: https://cas.mydomin.com/serviceValidate?ticket=ST-1485-7X6VirHikiEKadmDnt0Y-cas-01.mydomin.com&service=http%3A%2F%2Fl

排查思路

  • 对比CAS验证URL的核心差异:从日志能明显看到,Grails 3.3.2的验证URL自动带上了pgtUrl参数,而Grails 2.5.1的请求里没有这个参数。这个参数是CAS代理票据(Proxy Ticket)功能的关键,先确认你的业务是否需要代理登录——如果不需要,那这个参数可能就是问题根源。
  • 检查CAS服务器的实际响应:日志显示Grails 3.3.2获取的CAS服务器响应是空的,这直接导致XML解析器抛出"提前结束"异常。你可以手动复制日志里的完整验证URL,用浏览器或者curl工具访问,看看实际返回的内容:是空、错误页面,还是合法的CAS XML响应?
  • 核查Spring Security CAS插件版本与配置差异:Grails 3.x和2.x使用的Spring Security CAS插件版本差异很大,新版本插件可能默认启用了代理功能,自动添加pgtUrl。如果CAS服务器没有配置允许代理请求,或者无法访问pgtUrl对应的端点(比如你用了localhost,而CAS服务器在远程),就会返回空响应。
  • 验证网络与SSL连通性:确认Grails 3.3.2应用能正常访问CAS服务器的HTTPS地址,尤其是要检查应用是否信任CAS的SSL证书——证书不被信任会导致请求失败,返回空内容。另外,如果用了pgtUrl,要确保CAS服务器能访问到这个回调地址(localhost在本地开发时,远程CAS肯定访问不到)。

解决建议

  • 禁用代理票据功能(优先尝试):如果你的业务不需要代理登录,直接在Grails 3.3.2的配置文件(application.groovy或application.yml)中关闭代理相关配置,和Grails 2.5.1的行为保持一致:
    // application.groovy
    grails.plugin.springsecurity.cas.useProxy = false
    grails.plugin.springsecurity.cas.proxyCallbackUrl = null
    
    这样插件就不会自动添加pgtUrl参数,避免CAS服务器因无法处理代理请求返回空响应。
  • 修正pgtUrl的可访问性:如果确实需要代理功能,把pgtUrl改成CAS服务器能访问到的地址(比如用服务器的公网IP或域名,不要用localhost),同时确保应用的/secure/receptor端点没有被安全规则拦截。
  • 检查CAS服务器的配置:联系CAS服务器管理员,确认是否允许你的应用使用代理功能,是否在CAS的服务列表中注册了正确的回调地址。同时查看CAS服务器的日志,看处理验证请求时是否有连接失败或权限错误。
  • 手动测试验证请求:用curl命令模拟验证请求,比如:
    curl "https://cas.mydomain.com/cas/serviceValidate?ticket=ST-1553-4NR7XWRPXGioiJXs9oLd-cas-01.mydomain.com&service=http%3A%2F%2Flocalhost%3A8089%2Flogin%2Fcas"
    
    如果返回空,直接排查CAS服务器的问题;如果返回错误信息,根据提示调整配置。
  • 调整插件版本:如果是插件兼容性问题,可以尝试降低Grails 3.3.2使用的Spring Security CAS插件版本,选择一个和Grails 2.5.1插件行为更接近的版本(注意要兼容Grails 3.x)。

内容的提问来源于stack exchange,提问作者user1452701

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:22:35