2017-04-25 10 views
0

Spring SecurityCAS을 사용 중입니다. 다음과 같은 문제가 있습니다. 인증 오류가 형태로 잘 표시됩니다 CAS Server (예 : 잘못된 사용자 이름/암호)에서 발생합니다 및 사용 제대로 표시되면 태그 :스프링 보안 CAS : login.jsp에서 클라이언트 오류 표시

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

그러나 경우에 CAS Server 반환 성공과 AuthenticationExceptionCAS Client 없음에 발생하는 경우 오류는 기본적으로 CAS Client로 리디렉션됩니다. http://localhost:8080/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fj_spring_cas_security_check

그래서 클라이언트 측에서 무엇이 잘못되었는지 표시 할 수 없습니다. AuthenticationException을 던진 경우 클라이언트에서 오류를 표시하는 것이 가능합니까? JSP?

답변

0

슈퍼 깨끗하고 올바른 방법인지 확실하지 않지만 내가해온 방법은 쿠키를 사용하는 것입니다.

내가 할 일은 SimpleUrlAuthenticationFailureHandler을 연장하고 을 사용하여 마지막 인증 예외를 얻고 내 사용자 정의 오류 코드 쿠키를 작성하는 것입니다. 코드는 Scala에 있지만 매우 간단 다음 CAS server 측면에서 나는 다음과 같은 방법으로 JSP에 오류를 표시했습니다

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) 
    } 
} 

다음 :

<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 :

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

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