qq_36657274 2025-08-11 09:30 采纳率: 12.5%
浏览 18

cas 5.3X远程单点登录设置自己想要的错误提示

cas 5.3X远程单点登录, return ResponseEntity.status(403).body("Error Message"); 返回403 错误信息设置成 Error Message ,模板 th:each="err : ${#fields.errors('*')}" th:utext="${err}">Example error 怎样显示自己想要的值比如 Error Message

  • 写回答

6条回答 默认 最新

  • 檀越@新空间 2025-08-11 09:31
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    CAS 5.3.X 中,如果你想自定义 远程单点登录(Remote SSO) 过程中返回的错误信息,比如将 403 Forbidden 错误提示改为自定义内容,可以通过以下方式实现:


    问题分析

    你提到以下几点:

    1. 使用 return ResponseEntity.status(403).body("Error Message"); 返回 403 错误。
    2. 想要通过 Thymeleaf 模板中的 th:each="err : ${#fields.errors('*')}" 显示错误信息。
    3. 需要确保错误信息能被正确传递并显示。

    🛠️ 解决方案

    1. 修改 CAS 的错误页面配置

    CAS 默认使用 Thymeleaf 模板来渲染错误页面。你可以通过自定义错误页面模板来显示你的错误信息。

    步骤如下:

    • 找到 CAS 的模板目录,通常为:

      /cas/WEB-INF/views/
      
    • 在该目录下创建或修改错误页面模板文件,例如:

      error.html
      

    示例 error.html 内容:

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Error</title>
    </head>
    <body>
        <h1>Custom Error Page</h1>
        <div th:if="${#fields.hasErrors('*')}">
            <ul>
                <li th:each="err : ${#fields.errors('*')}" th:utext="${err}"></li>
            </ul>
        </div>
    </body>
    </html>
    

    注意: 如果你想在前端页面上显示错误信息,需要确保 CAS 服务端将错误信息以模型对象的形式传递给模板引擎。


    2. 自定义异常处理逻辑(可选)

    如果你希望在 CAS 后端拦截错误并自定义错误消息,可以考虑编写一个自定义的 ExceptionResolverHandlerExceptionResolver

    示例代码(Java):

    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
    
    public class CustomExceptionResolver extends SimpleMappingExceptionResolver {
        @Override
        protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
            ModelAndView modelAndView = new ModelAndView("error");
            modelAndView.addObject("error", "Your custom error message here");
            return modelAndView;
        }
    }
    

    然后在 Spring 配置中注册这个解析器:

    <bean class="com.example.CustomExceptionResolver" />
    

    3. 直接返回 JSON 格式错误信息(适用于 API 场景)

    如果你是通过 REST 接口进行 SSO 登录,并且希望返回 JSON 格式的错误信息,而不是 HTML 页面,可以这样做:

    示例代码:

    @GetMapping("/login")
    public ResponseEntity<String> login() {
        // 假设验证失败
        return ResponseEntity.status(HttpStatus.FORBIDDEN)
                             .body("{\"error\": \"Your custom error message\"}");
    }
    

    注意: 如果你是使用 CAS 的 Webflow 来处理登录流程,可能需要在 flow 中设置错误消息。


    4. 在 CAS 的 Webflow 中设置错误消息

    CAS 使用 Webflow 处理登录流程。你可以通过在 login-webflow.xml 文件中添加错误消息来实现自定义提示。

    示例:

    <view-state id="login" view="casLoginView" model="credentials">
        <on-entry>
            <evaluate expression="authenticationManager.authenticate(credentials)" result="authentication"/>
            <set name="requestScope.error" value="Your custom error message"/>
        </on-entry>
        <transition on="success" to="success"/>
        <transition on="error" to="error"/>
    </view-state>
    
    <view-state id="error" view="error">
        <on-entry>
            <set name="requestScope.message" value="${error}"/>
        </on-entry>
    </view-state>
    

    然后在 error.html 中使用:

    <p th:text="${message}">Default message</p>
    

    总结:关键步骤

    1. 自定义错误页面模板(如 error.html),使用 th:each#fields.errors 显示错误信息。
    2. 在后端逻辑中设置错误信息,确保它能被传递到模板中。
    3. 如果使用 REST API,可以直接返回 JSON 格式的错误信息。
    4. 对于 Webflow 流程,可以在 XML 中设置错误消息并传递到视图。

    📌 最终建议

    如果你的目标是让用户看到你自定义的错误信息(如“Your custom error message”),请优先考虑以下方式:

    • 修改 error.html 模板,并在其中使用 th:each 显示错误信息。
    • 确保错误信息被正确地传入模型(如通过 modelAndView.addObject(...))。

    如果你有更多关于 CAS 的配置细节(如是否使用 Webflow、是否是 REST API 等),我可以提供更具体的解决方案。

    评论

报告相同问题?

问题事件

  • 修改了问题 8月11日
  • 创建了问题 8月11日