然后经过CAS认证后跻身应用程式1,未有配备退出
在行使SpringSecurity时遭逢二个匪夷所思的难题,正是:
出处:
正文分两片段
当客商积极点击退出按键后,跳转到登陆界面,这一年实行登入操作。即使登陆成功,却照旧停留在的报到分界面(其实早就报到成功,固然手动修改U福睿斯L地址可以符合规律步入到必要登陆技艺步向的分界面),并且浏览器地址前边增添了
?logout
,看起来是那般的:
自打CAS 3.4就很好的援助了单点注销功用,配置也非常粗大略。
1.转外人的稿子,详细介绍了跨站单点登入的规律和解决方案
详见再一次查看了SpringSecurity文书档案发掘:SpringSecurity 4
默许退出地址为/logout
,並且辅助以下配置:
事先版本因为在CAS服务器通过HttpClient发送新闻时并未有一点点名称为POST情势,所以在CAS客商端的吊销Filter中平素不收受POST央浼(要知道Filter只对Post乞求起效果),也就从未有过做session销毁管理。
2.自个儿要好写代码,珍视介绍当中的主要部分
- invalidate-session 表示是还是不是要在脱离登入后让日前 session 失效,默以为 true。
- delete-cookies 钦赐退出登陆后须要删除的 cookie 名称,几个 cookie 之间以逗号分隔。
- logout-success-url 钦定成功脱离登陆后要重定向的 U福特ExplorerL。要求在意的是相应的 UCR-VL 应当是没有须要报到就可以访谈的。
- success-handler-ref 内定用来管理成功退出登入的 LogoutSuccessHandler 的援用。
www.129028.com,
1:
由于自个儿在类型中并未有配备退出登入后重定向的U奥迪Q5L,但SpringSecurity协助登入成功跳回到退出在此以前的分界面的逻辑,这就导致了再次点击登入后,登陆成功再一次跳回到了“退出地址分界面”,而并不曾真正的退出。退出分界面实际是海市蜃楼的,就是登入分界面。
三个事情系统应用软件1和APP2
假诺大家须要在以下那些站之间达成单点登入
要缓慢解决那些难点,我们只供给加一下陈设就能够:
在未曾陈设单点退出时,效果是那样子的
www.onmpw1.com
.and().logoutSuccessUrl
1:登入应用软件1,然后通过CAS认证后步入APP1,再访谈应用软件2不必要要证实
www.onmpw2.com
2:在APP第11中学年花甲之年是到cas的logout地址,现象注销成功分界面,然后再访问APP1,还是能步入的,因为APP1将客商的记名票据存入了session。
www.onmpw3.com
对于这种气象,大家有二种完毕方式,个中大家先来介绍实现相比轻松的不二秘诀。
那么达成了单点退出后的效应应该是那样子的:
方式一
1:登入应用软件1,然后通过CAS认证后跻身应用软件1,再访问应用软件2没有必要要表达
为了贯彻单点登入,当客商登陆当中的任何二个站点时,大家须求针对别的各个站点在浏览器端设置cookie音信。
2:顾客在APP1或然APP2点击注销,展现CAS的吊销成功页面,然后再访谈APP1恐怕应用程式2都急需重新证实。
假使客户在onmpw1站点进行登陆,登入成功授权今后,浏览器将会蕴藏一份儿onmpw1站点的cookie音讯。同期,为了能够登入onmpw2和onmpw3,大家需求在安装onmpw1的cookie的同事也对onmpw2和onmpw3实行cookie设置。因而在对onmpw1进行响应以前,我们须求先跳转到onmpw2和onmpw3站点去设置cookie信息。
现实配置为,在应用软件1和APP2的web.xml文件中加进:
下图是对于七个站点的单点登陆模型(四个的雕塑起来比较劳顿,为了节省时间,就用五个来代表,不过原理是一致的)
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
此种情形的表明步骤是那样的:
一、客户向www.onmpw1.com(以下简称onmpw1)诉求三个内需注解的页面。
裁撤的Filter要在另外Filter在此以前,分界面的裁撤连接到CAS的logout地址,如
[状态: 浏览器还尚无认证的cookie消息]
二、浏览器向onmpw1发送央浼(该央浼未有cookie音讯,因为它还从未存款和储蓄所属域为onmpw1.com的cookie消息)。
SingleSignOutFilter,首假诺在有ticket参数的时候,将session放到sessionMappingStorage,要是参数中存在logoutRequest,则撤废session,那什么样时候去注销sessionMappingStorage的事物吗?那是靠SingleSignOutHttpSessionListener来完结的,当有session被销毁的时候,触发将sessionMappingStorage中对应sessionid中的数据删除。
[情状: 浏览器还不曾表明的cookie音信]
为此在布置单点登出的时候,一定要安插这么些监听器,不然客商端很轻松变成内部存款和储蓄器溢出的。让我们先来走访SingleSignOutFilter的完全逻辑。
三、onmpw1开掘在伏乞中一贯不带cookie新闻,所以它将呼吁重定向到登录页面
[境况: 浏览器还未有注解的cookie新闻]
那就是说这一个是在哪些时候会触发呢,这么些是在你登入的随便顾客端,调用https://localhost:8080/logout,那一个获得cookie里面包车型地铁TGT数据,找到TGT中关系的保有ST对应的地点(即多少个cas client),向各类地方形式一个http需要,并传递logoutRequest参数。
四、顾客提交了登陆所需验证的新闻而且点击登入开关,浏览器发送三个post乞求到onmpw1。
来看看源代码是怎么落到实处的:
[情景: 浏览器还一直不认证的cookie信息]
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
// 转换参数
final HttpServletRequest request = (HttpServletRequest) servletRequest;
//判断参数中是否具有artifactParameterName属性指定的参数名称,默认是ticket
if (handler.isTokenRequest(request)) {
// 如果存在,在本地sessionMappingStorage中记录session。
handler.recordSession(request);
} else if (handler.isLogoutRequest(request)) {//判断是否具有logoutParameterName参数指定的参数,默认参数名称为logoutRequest
// 如果存在,则在sessionMappingStorage中删除记录,并注销session。
handler.destroySession(request);
// 注销session后,立刻停止执行后面的过滤器
return;
} else {
log.trace("Ignoring URI " + request.getRequestURI());
}
//条件都不满足,继续执行下面的过滤器
filterChain.doFilter(servletRequest, servletResponse);
}
protected ModelAndView handleRequestInternal(
final HttpServletRequest request, final HttpServletResponse response)
throws Exception {
final String ticketGrantingTicketId = this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request);
final String service = request.getParameter("service");
if (ticketGrantingTicketId != null) {
this.centralAuthenticationService
.destroyTicketGrantingTicket(ticketGrantingTicketId);
this.ticketGrantingTicketCookieGenerator.removeCookie(response);
this.warnCookieGenerator.removeCookie(response);
}
if (this.followServiceRedirects && service != null) {
return new ModelAndView(new RedirectView(service));
}
return new ModelAndView(this.logoutView);
}
五、onmpw1收到提交的印证新闻,起先验证那个音讯。假设注解成功,则标志该客户已经报到。然后会创立带有登陆顾客新闻的cookie,并将其参与响应音信中。
[动静: 浏览器还不曾表达的cookie音讯]
假如直接访问CAS的logout话,会油可是生注销成功页面,其实大多数情景下这些页面是没有要求的,更加多的供给恐怕是退出后展现登陆页面,况且登陆成功后依旧会跻身到前边的事务类别,
六、onmpw1一时还不去响应浏览器的央浼。那时它将会向浏览器发送重定向到www.onmpw2.com(以下简称onmpw2)的授命,並且还蕴涵在onmpw2站点必要重回的url地址,该地点为最早onmpw第11中学的。因为cookie新闻已经在响应消息中,所以那一个cookie也被发送给浏览器了。
当this.followServiceRedirects && service != null时才会跳转到本人钦命的view,service应该都相比熟习了,它是顾客传的参数,
[意况: 浏览器还一向不认证的cookie音讯]
点名cas大旨中间转播哪个地方,但大家只有传service 依旧不行的,还必要把followServiceRedirects属性设为true,上面看看哪些修改那几个性情
七、浏览器接收道带有验证的cookie消息和重定向到onmpw2的一声令下的响应音讯之后,将cookie音信的域设置为onmpw2存款和储蓄到本地,并且想onmpw2发送须要。那几个伏乞中会带有刚才的cookie音信。
那么能够修改cas-servlet.xml文件,在"logoutController"的bean配置中扩张质量“follow瑟维斯Redirects”,设置为“true”,然后在工作系统的吊销连接中参预"service参数",值为职业系统的断然U酷威L,那样就OK了,如您的事体种类UOdysseyL为:,那么注销UWranglerL就为:
[意况:浏览器中早已怀有属域为onmpw2的cookie音讯]
八、onmpw2立刻会重定向到供给回到的url地址,何况通过读取浏览器发送的cookie消息,获取到onmpw1的cookie。并将那cookie也一齐发送给浏览器。
假如出现这种场合:访问过http://localhost:8080/cas/logout事后不关浏览器,还能够访谈小编的应用
[意况:浏览器中早已有所属域为onmpw2的cookie消息]
可能因为:
九、浏览器在承受到那一个音信之后,会将所属域为onmpw1的cookie存款和储蓄在地面。并且再度向onmpw1发送多少个包涵cookie音信的央求。
1:你的CAS服务器将cookie设置成了浏览器有效,那么表示只要浏览器不休息,则一直有效。
[气象:浏览器中一度具备属域为onmpw2和onmpw1的cookie音信]