Spring Security CAS:在 login.jsp 上显示客户端错误

Posted

技术标签:

【中文标题】Spring Security CAS:在 login.jsp 上显示客户端错误【英文标题】:Spring Security CAS: show client error on login.jsp 【发布时间】:2017-09-22 15:01:53 【问题描述】:

我正在使用 Spring SecurityCAS 并遇到以下问题。当CAS Server 抛出身份验证错误(例如无效的用户名/密码)时,它会在表单中很好地显示并使用标签正确显示:

<form:errors path="*" id="msg" cssClass="alert alert-danger" element="div"/>

但如果CAS Server 返回成功并且CAS Client 上抛出AuthenticationException,则不会显示任何错误,因为基本上CAS Client 重定向回http://localhost:8080/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fj_spring_cas_security_check

所以我无法真正显示客户端出了什么问题。如果它抛出AuthenticationException,是否有可能在同一个JSP上显示来自客户端的错误?

【问题讨论】:

【参考方案1】:

不确定这是否是最干净且正确的方法,但我设法做到这一点的方法是使用 cookie。

我所要做的就是扩展SimpleUrlAuthenticationFailureHandler,使用request.getSession().getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION) 获得最后一个身份验证异常 并编写我的自定义错误代码 cookie。代码在Scala,但非常简单:

class CookieAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler

  val clientErrorCookie = "clientError"

  override def onAuthenticationFailure(request: HttpServletRequest, response: HttpServletResponse, exception: AuthenticationException): Unit = 
    val authenticationException = SecurityUtility.getSessionAuthException(request).getOrElse(exception)

    ClientErrors.values
      .filter(clientError => clientError.exceptionClass.equals(authenticationException.getClass))
      .foreach(clientError => response.addCookie(new Cookie(clientErrorCookie, clientError.errorCode)))

    super.onAuthenticationFailure(request, response, authenticationException)
  

然后,在CAS server 一侧,我通过以下方式在JSP 上显示错误:

<c:set var="clientErrorCookie" value="clientError"/>
<c:if test="$cookie.containsKey(clientErrorCookie)">
                    <div class="alert alert-danger">
                        <spring:message code="error.client.authentication.$cookie.get(clientErrorCookie).value"
                                        text="Client authentication error"/>
                    </div>
                </c:if>

在页面加载并显示错误后,我刚刚删除了JS中的那个cookie:

function deleteCookie(name) 
            document.cookie = name + '=; Path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
        

$(document).ready(function()
          deleteCookie('$clientErrorCookie');
        

【讨论】:

以上是关于Spring Security CAS:在 login.jsp 上显示客户端错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 CAS + Spring Security 实现 SSO

Spring-security-cas 插件单点注销不起作用

Spring Security 整合Cas

Grails Spring Security 和 CAS 问题

使用 Spring Security 和 CAS 单点注销

Spring Security - CAS 自定义到 LDAP 集成