背景:
为了提高用户体验,公司要求接入统一门户(Cas系统),我所负责的系统没有使用框架,所以直接在Web.xml中配置就可以了,主要考虑以下几个场景:
- 直接登录应用系统,未登录Cas的情况下,需要先跳转到Cas进行认证,认证后跳转到原系统;
2.已登录统一门户(Cas)的情况下,登录应用系统无需认证;
3.用户在应用系统注销时,需要通知统一门户(Cas),注销服务端
4.在统一门户系统中增加用户,并分配角色后,新的用户可以直接访问应用系统
方案
1. 理解cas登录过程
参考:
https://blog.csdn.net/qq_34246546/article/details/79493208
https://blog.csdn.net/ban_tang/article/details/80015946
https://www.cnblogs.com/ssgao/p/8816828.html
关键:明白TGT,TGC,ST这几个名词,
cas client通过filter拦截与cas服务器进行交互。它的主要配置主要有以下几个filter:
1.AuthenticationFilter:作用,判断用户是否登录,如果登录则进入第二步,否则重定向到cas服务器
2.TicketValidationFilter 对于client接收到的Service ticket进行验证
3.HttpServletRequestWrapperFilter
4.AssertionThreadLocalFilter
2.登录跳转问题
参考:
https://blog.csdn.net/shzy1988/article/details/50662462
https://www.cnblogs.com/fengmao/p/8137205.html
https://blog.csdn.net/wuzhong8809/article/details/84032196
https://www.cnblogs.com/eguid/p/6821622.html
jar包: cas-client.3.1.6.jar
可以打开Debug查看Cas调用过程*
web.xml关键配置如下:*
<!-- CAS 单点登录(SSO) 过滤器配置 (start) -->
<!-- 该过滤器用于实现单点登出功能。-->
<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>
<!-- CAS: 用于单点退出 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<!-- 下面的URL是Cas服务器的登录地址 -->
<param-value>http://CAS服务端所在服务器IP:8080/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!-- 下面的URL是具体某一个应用的访问地址 -->
<param-value>http://具体web应用程序所在服务器IP:8080</param-value>
</init-param>
<init-param>
<!-- 测试的时候发现,应用在Cas登录后无法自动跳转,通过Debug模式查看日志,发现需要配置该参数,配置以后就可以了 -->
<param-name>redirect</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<!-- 下面的URL是Cas服务器的认证地址 -->
<param-value>http://CAS服务端所在服务器IP:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!-- 下面的URL是具体某一个应用的访问地址 -->
<param-value>http://具体web应用程序所在服务器IP:8080</param-value>
</init-param>
<init-param>
<param-name>renew</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>gateway</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器负责实现HttpServletRequest请求的包裹,
比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
-->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
比如AssertionHolder.getAssertion().getPrincipal().getName()。
-->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3 注销
参考:
https://blog.csdn.net/shangzhiliang_2008/article/details/34870993/
关键是:后台要调用cas的logout url
# cas退出功能
转载[道仁](https://me.csdn.net/shangzhiliang_2008) 发布于2014-06-26 18:47:27 阅读数 5326 收藏
展开
<article class="baidu_pl" style="box-sizing: inherit; outline: 0px; margin: 0px; padding: 16px 0px 0px; display: block; position: relative; color: rgb(51, 51, 51); font-family: "Microsoft YaHei", "SF Pro Display", Roboto, Noto, Arial, "PingFang SC", sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
用了CAS,发现退出真是个麻烦事,退出后跳转到了CAS的注销页面,而且不关闭浏览器的话,其实并没有真的退出,输入地址仍是登陆状态。为了实现退出后登陆到跳转页面,做了以下配置:
1.server 端
修改src\main\webapp\WEB-INF\cas-servlet.xml里的logoutController
增加**p:followServiceRedirects="true"**使支持logout输入service参数为跳转路径。
1. <bean id="logoutController" class="org.jasig.cas.web.LogoutController"
2. p:centralAuthenticationService-ref="centralAuthenticationService"
3. p:logoutView="casLogoutView"
4. p:warnCookieGenerator-ref="warnCookieGenerator"
5. p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"
6. p:followServiceRedirects="true"
7. />
2.客户端
web.xml 中在登录的filter之前增加
1. <!-- 填写退出的URL -->
2. <context-param>
3. <param-name>casServerLogoutUrl</param-name>
4. <param-value>http://10.1.83.34:8080/cas/logout</param-value>
5. </context-param>
6. <!--单点退出配置-->
7. <listener>
8. <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
9. </listener>
10. <filter>
11. <filter-name>CAS Single Sign Out Filter</filter-name>
12. <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
13. </filter>
14. <filter-mapping>
15. <filter-name>CAS Single Sign Out Filter</filter-name>
16. <url-pattern>/*</url-pattern>
17. </filter-mapping>
在JSP中,如果直接把退出转到cas/logout之后,会跳转到CAS的注销页面,这个情况下,如果直接点击浏览器的回退按钮,发现仍然可以正常操作,也就是session并没有被注销掉,可能CAS的logout只是去掉了TGT吧。
为了解决这个问题,我只好重新写了个JSP,退出按钮跳转到这个JSP,这个JSP里先注销session, 然后再跳转到CAS的退出,并增加service参数,使跳转到登陆页面。
1. <a
2. href="${pageContext.request.contextPath}/web-root/include/logout.jsp" ></a>
3. <div id="box_T5" class="toptaps5">退出登录</div>
logout.jsp内容:
1. <body>
2. <%
3. session.invalidate();
4. response.sendRedirect(application
5. .getInitParameter("casServerLogoutUrl")
6. + "?service="
7. + application.getInitParameter("serverName") + "/myweb");
8. %>
9. </body>
4 用户同步
- 统一门户(Cas)系统调用应用系统实时接口,实现用户和角色的同步
2.夜间进行批量数据同步