CAS - 凭据错误时重定向到自定义登录页面

时间:2016-05-16 15:04:29

标签: redirect single-sign-on cas

早上好。

我已成功配置CAS SSO服务器和客户端。但是,我想更改CAS的配置以使用自定义登录页面。我按照this教程进行了这样的配置,它就像一个魅力。但是,问题是当我输入无效凭据(用户名或密码错误)时,它会尝试重定向到CAS的默认登录页面;但是,它应该重定向到自定义外部登录页面。如果您帮助我了解如何在输入错误凭据时将CAS重定向到其他页面,我将不胜感激。

这是我的casLoginView.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
    <script type="text/javascript">

        function doAutoLogin() {
            document.forms[0].submit();
        }
    </script>
</head>
<body onload="doAutoLogin();">
    <form id="credentials" method="POST" action="https://externalsite.com/cas-server-webapp-4.0.0/login?service=<%= request.getParameter("service") %>">
        <input type="hidden" name="lt" value="${loginTicket}" />
        <input type="hidden" name="execution" value="${flowExecutionKey}" />
        <input type="hidden" name="_eventId" value="submit" />
        <input type="hidden" name="username" value="<%= request.getParameter("username") %>" />
        <input type="hidden" name="password" value="<%= request.getParameter("password") %>" />
        <% if ("true".equals(request.getParameter("rememberMe"))) {%>
            <input type="hidden" name="rememberMe" value="true" />
        <% } %>    
        <input type="submit" value="Submit" style="visibility: hidden;" />
    </form>
</body>

这是我的外部自定义登录页面:

<form method="GET" action="https://externalsite.com/cas-server-webapp-4.0.0/">
    <p>Username : <input type="text" name="username" /></p>
    <p>Password : <input type="password" name="password" /></p>
    <p>Remember me : <input type="checkbox" name="rememberMe" value="true" /></p>
    <p><input type="submit" value="Login !" /></p>
    <input type="hidden" name="auto" value="true" />
    <input type="hidden" name="service" value="<%= request.getParameter("service") %>" />
</form>

基本上,我的外部登录页面将凭证发送到CAS登录页面,后者自动被提交。但是,当凭据错误时,CAS会重定向到默认登录页面,而不会重定向到我的外部登录页面。

问候。

2 个答案:

答案 0 :(得分:1)

您需要更改cas-server-webapp中login-webflow.xml的代码。 代码应更改如下:

<action-state id="handleAuthenticationFailure">
 <!-- Comment FailedLoginException and AccountNotFoundException  -->
 <!--<transition on="FailedLoginException" to="generateLoginTicket"/>-->
 <!--<transition on="AccountNotFoundException" to="generateLoginTicket"/>-->
</action-state>

添加:

<action-state id="customFailedLoginException">
    <evaluate expression="generateLoginTicketAction.generate(flowRequestContext)" />
    <transition on="generated" to="customFailedLoginExceptionView" />
</action-state>

<view-state id="customFailedLoginExceptionView" view="externalRedirect:#{requestParameters.service}&amp;errorMsg=failedLogin"/>

<action-state id="customAccountNotFoundException">
    <evaluate expression="generateLoginTicketAction.generate(flowRequestContext)" />
    <transition on="generated" to="customAccoundNotFoundExceptionView" />
</action-state>

<view-state id="customAccoundNotFoundExceptionView" view="externalRedirect:#{requestParameters.service}&amp;errorMsg=notFound" />

现在,如果您提交的用户名不存在或密码错误,您将获得一个带有名为&#39; errorMsg&#39;的参数的回复网址。

我还提供了一个关于如何使用客户端自定义登录屏幕而不是服务器登录srceen登录cas的示例。你可以下载它
https://github.com/yangminxing/cas-custom-login-page

答案 1 :(得分:0)

我通过更改login-webflow.xml文件的转换解决了我的问题。我所做的是创建一个新的动作状态:

LogicalCallContext

并且这个调用一个视图状态,它将用户重定向到我的外部登录页面

<action-state id="customFailedLogin">
    <evaluate expression="generateLoginTicketAction.generate(flowRequestContext)" />
    <transition on="generated" to="externalRedirection" />
</action-state>

(callingUrl是我创建并随服务网址一起发送的变量)。最后我刚刚更改了handleAuthenticationFailure

中的转换
<view-state id="externalRedirection" view="externalRedirect:#{requestParameters.callingUrl}&amp;error=true"/>

希望对其他人有帮助。