我在我的應用程序中實現了jasig-CAS,但現在我想知道更多。 是否可以做我自己的登錄頁面,然後它會自動(在後臺)對CAS中的用戶進行身份驗證。 這樣的步驟是下一個:使用CAS與自定義登錄頁
- 用戶進入登錄頁面
- 用戶輸入其憑據
- 如果驗證成功,用戶的憑據發送到CAS,從而CAS在其系統驗證的用戶,並給出了票(用戶不會看到任何CAS頁)
- 用戶訪問受保護的頁面
感謝。
我在我的應用程序中實現了jasig-CAS,但現在我想知道更多。 是否可以做我自己的登錄頁面,然後它會自動(在後臺)對CAS中的用戶進行身份驗證。 這樣的步驟是下一個:使用CAS與自定義登錄頁
感謝。
您可以使用REST API。 CAS REST
我在登錄時使用它,即Drupal。由於您沒有重定向,用戶沒有看到任何CAS頁面。
這樣的步驟將是:
此時您可以登錄他到你的應用程序(他已經登錄到CAS)或驗證你接收。然後登錄了他的票。
我想你需要得到一份拷貝CAS官方客戶端源代碼(cas-client-core),並確保您可以編譯它。
您需要在客戶端源代碼中的org.jasig.cas.client.authentication.AuthenticationFilter處更改doFilter()函數代碼,如下所示。
final HttpServletRequest request = (HttpServletRequest) servletRequest;
final HttpServletResponse response = (HttpServletResponse) servletResponse;
final HttpSession session = request.getSession(false);
final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;
if(request.getServletPath().toLowerCase().equals("/caslogout.jsp"))
{
// Set the custom client login page when you logout from CAS server.
request.setAttribute("casServerLogoutUrl",casServerLoginUrl.replace("login","logout"));
request.setAttribute("customServerLoginUrl",customServerLoginUrl);
//We must remove the attribute of CONST_CAS_ASSERTION manually
if(session!=null)
session.removeAttribute(CONST_CAS_ASSERTION);
filterChain.doFilter(request, response);
return;
}
if (assertion != null) {
filterChain.doFilter(request, response);
return;
}
// Although the custom login page must called caslogin, here you can change it.
if(request.getServletPath().toLowerCase().equals("/caslogin.jsp"))
{
//Set the a default parameter to the caslogin
request.setAttribute("defaultServerIndexUrl",defaultServerIndexUrl);
request.setAttribute("casServerLoginUrl",casServerLoginUrl);
filterChain.doFilter(request, response);
return;
}
final String serviceUrl = constructServiceUrl(request, response);
final String ticket = CommonUtils.safeGetParameter(request,getArtifactParameterName());
final boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);
if (CommonUtils.isNotBlank(ticket) || wasGatewayed) {
filterChain.doFilter(request, response);
return;
}
final String modifiedServiceUrl;
log.debug("no ticket and no assertion found");
if (this.gateway) {
log.debug("setting gateway attribute in session");
modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);
} else {
modifiedServiceUrl = serviceUrl;
}
if (log.isDebugEnabled()) {
log.debug("Constructed service url: " + modifiedServiceUrl);
}
final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);
if (log.isDebugEnabled()) {
log.debug("redirecting to \"" + urlToRedirectTo + "\"");
}
// Add a custom server login url parameter to the CAS login url.
response.sendRedirect(urlToRedirectTo+"&customLogin=custom&customLoginPage="+customServerLoginUrl);
自己編譯的CAS客戶端核心添加到您的客戶端Web應用程序的依賴。
將caslogin.jsp添加到您的客戶端Web應用程序。
<form method="GET" action="<%=request.getAttribute("casServerLoginUrl")%>">
<p>Username : <input type="text" name="username" /></p>
<p>Password : <input type="password" name="password" /></p>
<p><input type="submit" value="Login" /></p>
<input type="hidden" name="auto" value="true" />
<input type="hidden" name="service" value="<%=request.getParameter("service")==null?request.getAttribute("defaultServerIndexUrl"):request.getParameter("service")%>" />
<init-param>
<param-name>defaultServerIndexUrl</param-name>
<param-value>http://clientip:port/webappname/index.jsp</param-value>
</init-param>
<init-param>
<param-name>customServerLoginUrl</param-name>
<param-value>http://clientip:port/webappname/caslogin.jsp</param-value>
</init-param>
<%
String auto=request.getParameter("auto");
String customLogin=request.getParameter("customLogin");
if(auto!=null&&auto.equals("true"))
{
%>
<html>
<head>
<script language="javascript">
function doAutoLogin()
{
document.forms[0].submit();
}
</script>
</head>
<body onload="doAutoLogin()">
<form id="credentials" method="POST" action="<%=request.getContextPath()%>/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")%>" />
<input type="hidden" name="login_form" value="<%=request.getParameter("login_form")%>" />
<input type="hidden" name="rememberMe" value="true" />
<input type="submit" value="Submit" style="visibility: hidden" />
</form>
</body>
</html>
<%
}
else if(customLogin!=null&&customLogin.equals("custom"))
{
response.sendRedirect(request.getParameter("customLoginPage")+"?service="+request.getParameter("service"));
%>
<%
}
else
{%>
<!-- The Orgin Source Code of casLoginView.jsp!!!!!!!!!!!!!!!!!!!!!!!!! -->
<%}%>
我還提供了一個關於如何使用客戶端自定義登錄屏幕而不是服務器登錄srceen登錄cas的示例。你可以下載它
https://github.com/yangminxing/cas-custom-login-page
如果您不需要SSO,然後是你可以像rexposadas表示,採用CAS REST。 下面是一個很好的java示例:http://www.bmchild.com/2014/05/a-simple-cas-java-rest-client-example.html
但是這不適用於SSO,換句話說,您將無法在appA中登錄,然後在appB中自動登錄。這是因爲cas登錄頁面創建了用於SSO的TGT cookie。通過REST,你不會得到創建的cookie。
但是,如果你不需要SSO,那麼CAS REST就可以做到。
更新CAS文件對自定義用戶界面一頁:
https://apereo.github.io/cas/4.2.x/installation/User-Interface-Customization.html
注意,CAS網站和文檔,因爲原來的職位和一些其他的答案感動。
CAS首頁 - https://apereo.github.io/cas/4.2.x/index.html
CAS在Github - https://github.com/apereo/cas
遺產CAS維基 - https://wiki.jasig.org/display/CAS/Home
使用外部形式輸入憑據,不建議和擴大了攻擊面。請參閱https://apereo.github.io/cas/5.0.x/planning/Security-Guide.html
如果有人違反了您的外部Form應用程序,攻擊者可以訪問所有SSO連接的系統。