java web项目接入统一门户(Cas系统)

背景:

为了提高用户体验,公司要求接入统一门户(Cas系统),我所负责的系统没有使用框架,所以直接在Web.xml中配置就可以了,主要考虑以下几个场景:

  1. 直接登录应用系统,未登录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: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, 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 用户同步

  1. 统一门户(Cas)系统调用应用系统实时接口,实现用户和角色的同步

2.夜间进行批量数据同步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。