我在我的应用程序中实现了jasig-CAS,但现在我想知道更多。 是否可以执行我自己的登录页面,然后它会自动(在后台)对CAS中的用户进行身份验证。 所以步骤如下:
感谢。
答案 0 :(得分:1)
您可以使用REST API。 CAS REST
我用它来登录,即Drupal。由于您没有重定向用户,因此未看到任何CAS页面。
所以步骤将是:
此时您可以将他登录到您的应用程序(他已经登录CAS)或验证您收到的票证然后登录。
答案 1 :(得分:0)
我认为您需要获取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-client-core添加到客户端webapp的依赖项中。
将caslogin.jsp添加到您的客户端webapp。
<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")%>" />
&#13;
<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>
&#13;
<%
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!!!!!!!!!!!!!!!!!!!!!!!!! -->
<%}%>
&#13;
我还提供了一个关于如何使用客户端自定义登录屏幕而不是服务器登录srceen登录cas的示例。你可以下载它
https://github.com/yangminxing/cas-custom-login-page
答案 2 :(得分:0)
如果你不需要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就可以了。
答案 3 :(得分:0)
更新的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 on Github - https://github.com/apereo/cas
Legacy CAS Wiki - https://wiki.jasig.org/display/CAS/Home
答案 4 :(得分:0)
建议不要使用外部表单输入凭据,并扩大攻击面。见https://apereo.github.io/cas/5.0.x/planning/Security-Guide.html
如果有人违反了您的外部表格申请,攻击者就可以访问所有与SSO相关的系统。