资讯详情

资讯详情

Apereo CAS REST 协议注销(Logout):通过 DELETE 删除 TGT 终止单点登录会话

后端认证鉴权单点登录身份认证【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载本文围绕 Apereo CAS 的 REST 协议注销Logout接口展开讲解如何通过DELETE /cas/v1/tickets/{TGT-id}删除票据授予票据Ticket-Granting TicketTGT以终结单点登录SSO会话。读者将掌握该接口的请求格式、源码级执行链路含单点登出 SLO 与票据销毁的完整流程、响应语义、模块配置方式及对应的测试用例从而在自有 CAS 部署中安全、正确地通过 REST API 注销会话。一、REST 协议注销是什么Apereo CAS 除了提供浏览器端的标准注销logout流程之外还通过 REST Protocol 暴露了一组无状态的 HTTP 接口允许受信任的程序而非浏览器以纯 API 方式完成“创建票据 → 换取服务票据 → 注销会话”的完整生命周期。其中注销环节的定义文档即 REST-Protocol-Logout.md其核心语义只有一句话End a single sign-on session through the REST API by deleting its ticket-granting ticket.通过 REST API 删除票据授予票据从而结束一个单点登录会话。换句话说在 CAS REST 协议中一个 TGT 就代表一个 SSO 会话。创建 TGTPOST /cas/v1/tickets相当于登录而注销就是把这个 TGT 从票据注册中心Ticket Registry中删除。文档明确指出了这一点Destroy the SSO session by removing the issued ticket通过移除已签发的票据来销毁 SSO 会话。二、核心操作一条 DELETE 请求注销会话原文档给出的注销请求示例非常简洁DELETE /cas/v1/tickets/TGT-fdsjfsdfjkalfewrihfdhfaie HTTP/1.0分解这条请求组成要素取值说明HTTP 方法DELETE表示销毁资源而非查询或修改路径前缀/cas/v1/tickets由上下文路径/cas REST 端点基路径/v1/tickets组成路径变量TGT-fdsjfsdfjkalfewrihfdhfaie待销毁的票据授予票据 ID即创建 TGT 时返回的Location头中的票据 ID协议版本HTTP/1.0可省略属于标准 HTTP 头这里的关键是把真实会话对应的 TGT ID填入路径。该 ID 通常来自先前创建会话时的响应例如在 REST-Protocol-Request-TicketGrantingTicket.md 中POST /cas/v1/tickets成功后会返回201 Created Location: http://www.whatever.com/cas/v1/tickets/{TGT id}Location头中的{TGT id}正是本条注销请求路径变量应填写的值。三、端点定义与实现类TicketGrantingTicketResourceREST 协议的端点常量定义在 RestProtocolConstants.javaString BASE_ENDPOINT /v1; String ENDPOINT_TICKETS BASE_ENDPOINT /tickets;而处理注销逻辑的控制器是TicketGrantingTicketResource位于 TicketGrantingTicketResource.java。该类用 Spring MVC 注解同时声明了 TGT 的“创建”与“销毁”两个操作POST /v1/tickets—— 创建 TGTcreateTicketGrantingTicketDELETE /v1/tickets/{tgtId:.}—— 销毁 TGTdeleteTicketGrantingTicket。注销方法的核心代码DeleteMapping(value RestProtocolConstants.ENDPOINT_TICKETS /{tgtId:.}, produces MediaType.APPLICATION_JSON_VALUE) Operation(summary Delete ticket-granting ticket, parameters Parameter(name tgtId, in ParameterIn.PATH, required true, description Ticket-granting ticket id)) public ResponseEntityListSingleLogoutRequestContext deleteTicketGrantingTicket( PathVariable final String tgtId, final HttpServletRequest request, final HttpServletResponse response) { val requests singleLogoutRequestExecutor.execute(tgtId, request, response); return new ResponseEntity(requests, HttpStatus.OK); }从这段实现可以提炼出三个重要的实现事实路径变量{tgtId:.}正则确保票据 ID 中的点号等字符也能被完整匹配TGT ID 形如TGT-xxxx通常不含点号但该写法保证了对 ID 的完整捕获。响应类型方法返回ResponseEntityListSingleLogoutRequestContext即注销操作的响应体是单点登出SLO请求上下文列表详见第五节。成功状态码销毁成功时固定返回200 OKHttpStatus.OK与创建时的201 Created形成对比。此外该控制器还对GET /v1/tickets返回405 METHOD_NOT_ALLOWED见rejectGetResponse即同一路径只允许创建与销毁两种语义化操作。四、注销执行链路从 HTTP 请求到票据销毁deleteTicketGrantingTicket本身不直接操作票据而是委托给SingleLogoutRequestExecutor。该接口定义在 SingleLogoutRequestExecutor.javaFunctionalInterface public interface SingleLogoutRequestExecutor { String BEAN_NAME defaultSingleLogoutRequestExecutor; ListSingleLogoutRequestContext execute(String ticketId, HttpServletRequest request, HttpServletResponse response); }默认实现是 DefaultSingleLogoutRequestExecutor.java其execute方法按以下顺序完成注销按 ID 取出票据通过ticketRegistry.getTicket(ticketId, Ticket.class)从票据注册中心获取票据若票据不存在则记录 debug 日志并返回空列表此时 HTTP 层面仍是200 OK。触发单点登出SLO当票据是TicketGrantingTicket时调用logoutManager.performLogout(...)把该 TGT 关联的已认证服务逐一纳入单点登出请求列表其中状态为FAILURE的请求会输出 warn 日志。删除票据调用ticketRegistry.deleteTicket(ticketId)从注册中心移除该 TGT——这正是“销毁 SSO 会话”的本质动作。发布销毁事件若票据是 TGT则通过applicationContext.publishEvent(new CasTicketGrantingTicketDestroyedEvent(...))发布CasTicketGrantingTicketDestroyedEvent事件供审计、统计等监听器消费。返回 SLO 结果最终把单点登出请求上下文列表作为响应体返回。这段链路清晰地展示了REST 注销不仅是删除一张票据还会联动执行 CAS 的单点登出SLO协议通知该会话下所有注册过的服务执行登出回调。如果只想单纯销毁票据而不触发 SLO从源码结构看可通过调整全局注销/ SLO 相关的策略配置来改变LogoutManager的行为具体以各版本配置属性为准。五、响应语义200 OK SLO 上下文列表注销成功的响应示例HTTP/1.1 200 OK Content-Type: application/json [ ]由于DeleteMapping声明了produces MediaType.APPLICATION_JSON_VALUE响应体为 JSON。列表中的每个元素是SingleLogoutRequestContext定义见 SingleLogoutRequestContext.java它描述了一次单点登出请求的各项属性status请求状态如成功或失败见LogoutRequestStatusticketId与该登出请求关联的票据 IDservice需要被登出的目标服务logoutUrl执行登出回调的 URLregisteredService关联的注册服务策略logoutType登出消息的发送方式如BACK_CHANNEL/FRONT_CHANNELproperties登出请求携带的属性映射。在大多数“仅有 TGT、没有待登出服务”的简单场景下响应体通常是空数组[]当该 TGT 曾向多个服务签发过票据时数组中会包含对应数量的 SLO 上下文对象。测试用例 TicketGrantingTicketResourceTests.java 中的deletionOfTGT也验证了这一点Test void deletionOfTGT() throws Throwable { when(ticketRegistry.getTicket(anyString(), (ClassTicket) any())) .thenReturn(new MockTicketGrantingTicket(casuser)); this.mockMvc.perform(delete(TICKETS_RESOURCE_URL /TGT-1)).andExpect(status().isOk()); }该测试使用 MockMvc 向/cas/v1/tickets/TGT-1发起DELETE断言响应状态为isOk()200从测试角度印证了“DELETE TGT 返回 200 OK”的行为契约。六、模块启用与端点装配REST 协议注销功能并不需要单独的模块——它属于cas-server-support-rest模块的一部分。在原文档对应的 REST-Protocol.md 中明确指出在 overlay 工程中加入以下依赖即可启用整套 REST 能力含 TGT 创建、注销等端点org.apereo.cas : cas-server-support-rest模块内的自动装配类 CasRestAutoConfiguration.java 通过ConditionalOnFeatureEnabled(feature CasFeatureModule.FeatureCatalog.RestProtocol)按特性开关加载并完成三件与注销直接相关的事装配TicketGrantingTicketResource控制器 Bean注入RestAuthenticationService、CentralAuthenticationService、TicketGrantingTicketResourceEntityResponseFactory以及SingleLogoutRequestExecutorBean 名defaultSingleLogoutRequestExecutor将/v1端点加入 Web 安全忽略列表getIgnoredEndpoints()使其可被公开调用为/v1/**挂载认证节流throttling拦截器casRestThrottlingWebMvcConfigurer用于防暴力破解。值得一提的是REST-Protocol.md 特别警告REST 端点可能成为针对 CAS 服务器的字典暴力破解的理想目标建议启用节流throttling支持。注销接口本身不涉及凭据校验但整体 REST 端点的安全防护策略同样适用于它例如通过安全配置限制/v1/tickets的访问来源。七、与其他 REST 操作的衔接会话全生命周期把注销放入 REST 协议的完整流程中可以更清楚地理解它的位置阶段请求说明登录创建会话POST /cas/v1/tickets提交用户名/密码成功返回201 Created与Location头中的 TGT ID会话保持/换票POST /cas/v1/tickets/{TGT-id}用 TGT 换取 Service TicketST注销销毁会话DELETE /cas/v1/tickets/{TGT-id}删除 TGT触发 SLO返回200 OK原文档 REST-Protocol-Logout.md 强调“通过删除其票据授予票据来结束单点登录会话”这正体现了 CAS REST 协议的无状态设计REST 调用方自己持有 TGT 并负责其生命周期CAS 只充当认证引擎而非会话容器。因此在调用方代码中注销动作通常与“创建 TGT”成对出现例如 REST-Protocol.md 中给出的 pac4jCasRestFormClient用法// ... 创建 TGT、换取并校验 ST 之后 client.destroyTicketGrantingTicket(profile, webContext);destroyTicketGrantingTicket底层正是向DELETE /cas/v1/tickets/{TGT-id}发起请求与本文所述端点一一对应。八、使用注意事项结合原文档与源码实现实际使用该接口时应注意以下几点TGT ID 必须真实有效DefaultSingleLogoutRequestExecutor在注册中心找不到对应票据时会静默返回空列表HTTP 仍为200 OK。因此调用方应把“注销是否成功”理解为“删除请求已受理”而非“票据确实存在过”。注销是幂等删除动作同一 TGT 重复 DELETE 不会抛错首次删除后再次请求只是查不到票据适合在客户端做“尽力而为”的清理。触发 SLO 的副作用当该 TGT 关联了已签发过 ST 的服务时注销会联动发起单点登出回调请确保目标服务的 SLO 配置符合预期避免误登出。安全防护不可省REST 端点含注销可能成为攻击目标建议启用节流模块并限制/v1/**的网络访问来源具体方案可参考 REST-Protocol.md 中关于 Throttling 的指引。与标准浏览器注销的区别浏览器注销/cas/logout会清除 CAS 会话 Cookie 并触发页面跳转REST 注销则完全由调用方通过 API 驱动无 Cookie 与页面参与适合程序化登出场景。结语CAS 的 REST 协议注销Logout是一个语义清晰、实现简洁的接口一条DELETE /cas/v1/tickets/{TGT-id}请求即可在源码层面依次完成“取出票据 → 执行单点登出 → 删除票据 → 发布销毁事件 → 返回 SLO 上下文列表”的完整链路。结合 TicketGrantingTicketResource.java 与 DefaultSingleLogoutRequestExecutor.java 的实现开发者可以清楚地把 REST 注销纳入“创建 TGT—换取 ST—注销会话”的程序化认证闭环在集成自有系统时准确掌控会话的创建与销毁边界。赞分享后端认证鉴权单点登录身份认证【免费下载链接】casApereo CAS - Identity Single Sign On for all earthlings and beyond.项目地址https://gitcode.com/gh_mirrors/ca/cas点击查看免费下载相关推荐Apereo CAS REST 协议完全指南程序化获取票据、校验凭据与注销会话Apereo CAS REST 协议完全指南程序化获取票据、校验凭据与注销会话 导读 Apereo CAS 的 REST 协议REST Protocol将后端认证鉴权单点登录身份认证Apereo CAS 的 OpenID Connect 登出Logout能力全解析RP-Initiated Logout、back-channel 与 front-channel 单点登出Apereo CAS 的 OpenID Connect 登出Logout能力全解析RP Initiated Logout、back channel 与 f后端认证鉴权单点登录身份认证Apereo CAS 注销与单点注销SLO完全指南SSO 会话销毁、Back/Front Channel 通知与按服务粒度配置Apereo CAS 注销与单点注销SLO完全指南SSO 会话销毁、Back/Front Channel 通知与按服务粒度配置 本文围绕 Apereo C后端认证鉴权单点登录身份认证上一篇如何在ruoyi-vue-pro中集成Elasticsearch实现企业级搜索性能优化下一篇数据驱动研发范式革新RD-Agent如何重构AI时代的工业研发体系创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →