需求:cas服务端登录成功后始终显示登录界面,切换用户,刷新客户端请求切换相应用户信息。
从未接触过cas单点登录,在网上查了很多资料,主要分为以下步骤:
1.创建证书
2.配置服务端
3.配置客户端
4.修改服务端登录流程跳转等
5.测试
一、其中 1 2 3 可参考 http://blog.csdn.net/small_love/article/details/6664831,并检查证书是否和你创建的相符,记住不要创建多个:
keytool -v -list -keystore E:\work\jdk6\jre\lib\security\cacerts
因为我们的客户端公司已经封装过了,所以无需配置
二、修改cas服务端中登录流程成功跳转到登录页,修改login-webflow.xml 中判断service是否为空,为null 跳转的generateLoginTicket (有2处判断, 2处都要修改)
测试,登录成功能跳转到登录页。此时发现一个bug,服务端切换用户时要输入两次,客户端才能正确显示用户信息,f12查看登录情况,发现第一登录并没有成功。302 found。此时很纠结 原因是日志神马的都没有。没有办法。把cas服务端文件夹都看了一遍发现 class 文件夹下有log4j.xml配置。果断修改日志打印。日志华丽丽打印出了一个错误Cannot create a session after the response has been committed.网上搜索,luckly 居然也有人碰到这个问题,解决方案
http://blog.csdn.net/wang725/article/details/50828758
直接把terminateWebSessionListener 注释了 ,修改cas-servlet.xml
再次测试 服务端切换用户正常,客户端怎么刷新切换用户失败。开始我以为是客户端的问题,仔细想不是客户端的问题。是切换时cookie并未删除前一用户的信息;主要修改org.jasig.cas.web.flow.AuthenticationViaFormAction.submit 方法,增加以下代码:
@NotNull
private CentralAuthenticationService centralAuthenticationService;
public void setTicketGrantingTicketCookieGenerator(
final CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator) {
this.ticketGrantingTicketCookieGenerator = ticketGrantingTicketCookieGenerator;
}
final HttpServletRequest request = WebUtils.getHttpServletRequest(context);
final HttpServletResponse response = WebUtils.getHttpServletResponse(context);
final String ticketGrantingTicketIdCo = this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request);
if (ticketGrantingTicketIdCo != null) {
this.centralAuthenticationService
.destroyTicketGrantingTicket(ticketGrantingTicketIdCo);
this.ticketGrantingTicketCookieGenerator.removeCookie(response);
this.warnCookieGenerator.removeCookie(response);
}
注意 CookieRetrievingCookieGenerator 注入,修改修改cas-servlet.xml,在authenticationViaFormAction中增加 p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" 注入
重新启动,测试,服务端和客户端测试正常