CAS服务端:
1.需要在cas-servlet.xml添加一个controller:remoteLoginController
<bean id="handlerMappingC"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<prop key="remoteLogin">remoteLoginController</prop>
</bean>
2.在添加一个对应的controller bean
<bean id="remoteLoginController" class="org.jasig.cas.expand.web.flow.RemoteLoginAction"
p:argumentExtractors-ref="argumentExtractors"
p:warnCookieGenerator-ref="warnCookieGenerator"
p:centralAuthenticationService-ref="centralAuthenticationService"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"></bean>
3.添加对应的Action
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;
import org.jasig.cas.CentralAuthenticationService;
import org.jasig.cas.authentication.principal.Service;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.jasig.cas.client.util.CommonUtils;
import org.jasig.cas.ticket.TicketException;
import org.jasig.cas.web.support.ArgumentExtractor;
import org.jasig.cas.web.support.CookieRetrievingCookieGenerator;
import org.jasig.cas.web.support.WebUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import org.springframework.web.servlet.view.RedirectView;
public class RemoteLoginAction extends AbstractController {
@NotNull
private CentralAuthenticationService centralAuthenticationService;
@NotNull
private CookieRetrievingCookieGenerator warnCookieGenerator;
@NotNull
private CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator;
private boolean pathPopulated = false;
/** Extractors for finding the service. */
@NotEmpty
private List<ArgumentExtractor> argumentExtractors;
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String clientLoginUrl = request.getParameter("clientLoginUrl");
request.setAttribute("clientLoginUrl", clientLoginUrl);
request.getSession().setAttribute("clientLoginUrl", clientLoginUrl);
logger.info("clientLoginUrl : " + clientLoginUrl);
String uName = request.getParameter("username");
String password = request.getParameter("password");
UsernamePasswordCredentials credentials = null;
if (CommonUtils.isNotBlank(uName) && CommonUtils.isNotBlank(password)) {
credentials = new UsernamePasswordCredentials();
credentials.setPassword(password);
credentials.setUsername(uName);
} else {
return new ModelAndView(new RedirectView(clientLoginUrl));
}
if (!this.pathPopulated) {
final String contextPath = request.getContextPath();
final String cookiePath = StringUtils.hasText(contextPath) ? contextPath
+ "/"
: "/";
logger.info("Setting path for cookies to: " + cookiePath);
this.warnCookieGenerator.setCookiePath(cookiePath);
this.ticketGrantingTicketCookieGenerator.setCookiePath(cookiePath);
this.pathPopulated = true;
}
final Service service = WebUtils.getService(this.argumentExtractors,
request);
String ticketGrantingTicketId = "";
String serviceTicket = "";
try {
ticketGrantingTicketId = this.centralAuthenticationService
.createTicketGrantingTicket(credentials);
/***
* 产生新的票据,并将票据及服务记录在缓存中
*/
serviceTicket = this.centralAuthenticationService
.grantServiceTicket(ticketGrantingTicketId, service);
this.ticketGrantingTicketCookieGenerator.removeCookie(response);
this.ticketGrantingTicketCookieGenerator.addCookie(request,
response, ticketGrantingTicketId);
this.warnCookieGenerator.addCookie(request, response, "true");
} catch (TicketException e) {
return new ModelAndView(new RedirectView(clientLoginUrl));
}
return new ModelAndView(new RedirectView(
request.getParameter("service") + "?ticket=" + serviceTicket));
}
public void setWarnCookieGenerator(
final CookieRetrievingCookieGenerator warnCookieGenerator) {
this.warnCookieGenerator = warnCookieGenerator;
}
public void setArgumentExtractors(
final List<ArgumentExtractor> argumentExtractors) {
this.argumentExtractors = argumentExtractors;
}
public final void setCentralAuthenticationService(
final CentralAuthenticationService centralAuthenticationService) {
this.centralAuthenticationService = centralAuthenticationService;
}
public void setTicketGrantingTicketCookieGenerator(
final CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator) {
this.ticketGrantingTicketCookieGenerator = ticketGrantingTicketCookieGenerator;
}
}
4.修改一下登录成功会自动重定向到你提供的service地址,现在要做的是登录不成功的时候返回自定义的登录页面,需要修改casLoginView.jsp,直接重定向到clientLoginUrl
<% response.sendRedirect(request.getAttribute("clientLoginUrl").toString()); %>
CAC客户端:
1.web.xml的配置
网上都有,就不贴了
2.修改认证filter,添加clientLoginUrl给服务端认证失败时重定向使用
3.自定义登录页面
<form action="https://casip:casport/cas/remoteLogin"
method="post">
<input type="hidden" id="targetService" name="service"
value="认证成功以后返回的URL" /> <input type="hidden"
name="clientLoginUrl" value="自定义登录页面的URL" />
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登陆" /></td>
</tr>
</table>
</form>
自己试试吧
分享到:
相关推荐
一、CAS自定义登录页面概述 CAS的默认登录页面是基于JSP的,但我们可以替换为HTML、React、Vue等其他技术栈构建的页面。自定义登录页面主要涉及以下几个步骤: 1. 创建自定义登录页面:首先,你需要设计并创建一个...
总的来说,CAS自定义登录页面涉及到Web开发和安全性理解,你需要熟悉HTML/CSS/JavaScript来定制界面,以及理解CAS的工作原理以确保正确配置。如果你希望对CAS有更深入的理解或进行更复杂的定制,可以学习相关的文档...
在本主题中,我们将深入探讨如何在CAS中进行自定义加密和登录验证。 首先,了解CAS的基本工作原理至关重要。CAS服务器作为认证中心,负责验证用户的身份。当用户尝试访问受保护的应用时,会被重定向到CAS服务器进行...
完整项目在https://download.csdn.net/download/u010588262/10327539 这个资源是新增功能之后的main文件夹 对应博客系列:https://blog.csdn.net/u010588262/article/category/7548325 对应博客这篇:...
在实现客户端自定义登陆页面时,需要遵守三个基本原则:不影响原有统一登陆界面功能、客户端应尽量保持简单、尽量保证原有功能的完整性和安全性。然而,需要注意的是,将登陆页面放到客户端本身就是降低了CAS的安全...
由于实际内容没有给出,我将基于常见的CAS自定义登录流程进行讲解。 首先,理解CAS的工作原理至关重要。当用户尝试访问一个受CAS保护的应用时,会被重定向到CAS服务器的登录页面。在这里,用户输入凭证,如用户名和...
在本项目中,我们面临的是一个自定义CAS界面的任务,这通常涉及到对CAS服务器默认登录界面的个性化设计,以满足特定的用户交互需求或企业品牌形象。 首先,了解CAS的基本工作原理是必要的。当用户尝试访问受CAS保护...
cas4.0版本的 单点登录 自定义页面。希望对你有用,最低资源分,辛苦分。有问题可以交流学习。谢谢
标题中的“让CAS支持客户端自定义登陆页面——客户端篇”表明了本文主要探讨的是如何在中央认证服务(Central Authentication Service, CAS)系统中,允许客户端应用程序实现自定义登录页面的配置与实现。CAS是一个...
在实际应用中,为了满足企业或组织的个性化需求,往往需要对CAS默认的登录界面进行自定义,以提升用户体验或符合品牌风格。 【描述】"本项目旨在帮助开发者在CAS项目中集成并修改登录页面。用户可以直接将压缩包中...
让CAS支持客户端自定义登陆页面----服务器篇--.doc
改造cas,实现自定义登录页面,及错误跳转。具体参考我的博客 http://blog.csdn.net/just_lion/article/details/17204979
在“cas源码修改-登录页面”这个主题中,我们将深入探讨如何定制CAS服务器的登录界面以满足特定需求。 首先,CAS的登录页面通常位于`/login`路径下,这是由CAS服务器的核心组件处理的。在源码中,这部分主要涉及到`...
1. **不影响原有统一登录界面功能**:确保自定义后的登录页面依然能够正常工作,不影响CAS的基本认证流程。 2. **客户端应尽量保持简单**:避免客户端侧过于复杂的配置或代码,降低维护难度。 3. **尽量保证原有功能...
当用户尝试访问受CAS保护的应用时,如果用户尚未登录,他们会被重定向到CAS服务器的登录页面。在这里,用户输入他们的凭证,如用户名和密码。一旦验证成功,CAS会生成一个服务票证(Service Ticket),并将用户...
标题中的“自定义客户端登录CAS服务器-iframe实现”是指一种基于CAS(Central Authentication Service)的认证方式,它利用iframe在不离开当前页面的情况下实现用户的单点登录(Single Sign-On,SSO)。CAS是一种...
### 让CAS支持客户端自定义登录页面——服务器端配置详解 #### 一、背景与目的 随着企业级应用系统的不断扩展和发展,身份认证系统(如CAS)的安全性和灵活性变得尤为重要。CAS(Central Authentication Service)...
CAS 单点登录 5.39 版本 自定义登录页面改造 响应式页面-附件资源