作者:@ssgao
本文为作者原创,转载请注明出处:https://www.cnblogs.com/ssgao/p/8817167.html
目录
该图
当一个web 浏览器登录到应用服务器时,应用服务器(application)会监测用户的session,如果没有session,则应用服务器会把url跳转到CAS server上。要求
用户登录,用户登录成功,CAS server会记住请求的application的url和该用户的sessionId(在应用服务器跳转到Url时,通过出参数传给CAS server).此时在CAS服务器会种下TGC Cookie值到web browser ,拥有该TGC Cookie的web browser 可以无需登录进入所有建立sso服务的应用服务器application
第二张图中,当一个web浏览器要求退出应用服务器,应用服务器application会把url跳转到CAS server上的/cas/logout url资源上。
CAS server接受到请求后,会检测用户的TGC cookie,把对应的session清除,同时会找到所有通过该TGC sso登录的应用服务器URL提交请求,所有的回调请求中包含一个参数 logoutRequest。
1 2 3 4 | <samlp:LogoutRequest ID= "[RANDOM ID]" Version= "2.0" IssueInstant= "[CURRENT DATE/TIME]" > <saml:NameID> @NOT_USED @</saml:NameID> <samlp:SessionIndex>[SESSION IDENTIFIER]</samlp:SessionIndex> </samlp:LogoutRequest> |
所有收到请求的应用服务器application会解析这个参数,获取sessionId,根据这个ID获取session后,把session 删除。这样就实现了单点登出功能。
首先,要实现single sign out,在应用服务器application端的web.xml要加入以下配置
1 2 3 4 5 6 7 8 9 10 11 | <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> <listener> <listener- class >org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener- class > </listener> |
注意:如果有配置CAS client Filter,则CAS Signle Sign out Filter 必须放在CAS client Filter之前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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); } |
如果直接CAS的logout话,会出现注销成功页面,其实大部分情况下这个页面是没有必要的,更多的需要可能是退出后显示登录页面,并且登录成功后还是会进入到之前的业务系统,那么可以修改cas-servlet.xml
在logoutController的bean配置中添加属性"followServiceRedirects" 设置为true,然后在业务系统的注销连接中加入"service 参数",值为业务系统的绝对URL。
如你的业务系统URL为http://a:8080/login 那么注销URL就是 http://localhost:8080/cas/logout?service=http://a:8080/login
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步