单点登录cas-4.0.0 只是简单的同时登入,同时登出功能

什么是单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

什么是cas

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
【1】开源的企业级单点登录解决方案。
【2】CAS Server 为需要独立部署的 Web 应用。
【3】CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

SSO单点登录访问流程主要有以下步骤:

1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。

3. 用户认证:用户身份认证。

4. 发放票据:SSO服务器会产生一个随机的Service Ticket。

5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。

6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

CAS服务端部署

Cas服务端其实就是一个war包。
在资源cassourcecas-server-4.0.0-releasecas-server-4.0.0modules目录下
cas-server-webapp-4.0.0.war 将其改名为cas.war放入tomcat目录下的webapps下。启动tomcat自动解压war包。浏览器输入http://localhost:8080/cas/login ,可看到登录页面

cas下载链接:https://pan.baidu.com/s/1Domy7fuej2OnAbkcM-RMHQ 密码:70n5

不要嫌弃这个页面丑,我们后期可以再提升它的颜值。暂时把注意力放在功能实现上。 这里有个固定的用户名和密码 casuser/Mellon登录成功后会跳到登录成功的提示页面

 

cas启动完毕!!!

第二步

修改tomcat端口,也可以不修改

 修改CAS配置文件 修改cas的WEB-INF/cas.properties

去除https认证

CAS默认使用的是HTTPS协议,如果对安全要求不高,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。

修改cas的WEB-INF/deployerConfigContext.xml 
找到下面的配置

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient"/>

这里需要增加参数p:requireSecure=”false”,requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用 

修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml 
找到下面配置

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />

参数p:cookieSecure=”true”,同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。
参数p:cookieMaxAge=”-1”,是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。
我们这里将cookieSecure改为false , cookieMaxAge 改为3600


修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml 
找到下面配置

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />


我们这里将cookieSecure改为false , cookieMaxAge 改为3600

===================================================

现在来新建maven项目,cas,创建过程,请浏览这篇 eclipse创建maven项目 随想,现在maven的pom.xml文件中添加jar包依赖

<!-- cas -->
<dependency>
  <groupId>org.jasig.cas.client</groupId>
  <artifactId>cas-client-core</artifactId>
  <version>3.3.3</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
    </exclusion>
  </exclusions>
</dependency>

配置web.xml

<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>

<!--此处会跳转到cas单点登录的登录页面
<param-value>http://localhost:38080/cas/login</param-value>
<!--这里的server是服务端的IP -->
</init-param>
<init-param>
<param-name>serverName</param-name>

<!--成功后跳转的ip-->

<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<!-- 该过滤器负责对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>
<param-value>http://localhost:38080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>

<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>

<!-- 该过滤器使得开发者可以通过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 Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

配置完成后,启动maven项目,会跳转至cas的登录页面

登录成功后跳转至maven的欢迎界面http://localhost:38080/cas/login?service=http%3A%2F%2Flocalhost%3A8081%2Fcas1%2F

service后面的ip和port取自于web.xml配置文件,service后面的地址也是登录后转发的地址。

 新建第二个maven项目,创建过程与上一样,pom.xml文件添加jar包依赖,web.xml文件添加单点登录配置

,两个项目用同一个tomcat启动,也可以用两个tomcat启动,然后访问第一个项目,登录成功后,访问第二个项目的时候,就不需要再次登录,会直接跳转到第二个项目的欢迎界面,可以看到输出下面内容,到这里,单点登录已经成功

我们可以将这个链接添加到index.jsp中

<a href="http://localhost:38080/cas/logout">退出登录</a>

 但我们更希望退出登录后,能自动跳转到某个页面,那如何处理呢? 
修改cas系统的配置文件cas-servlet.xml

<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
p:servicesManager-ref="servicesManager"
p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

<a href="http://localhost:38080/cas/logout?service=http://localhost:38080/cas/login?service=http://localhost:8080/cas1/index.jsp">退出登录</a>

如果这样的a标签会ticket验证不过去,<a href="http://localhost:38080/cas/logout?service=http://localhost:8080/cas1">退出登录</a>

升级单点登录----单点登录页面改造,单点登录验证改成匹配数据库,动态验证

修改cas服务端中web-inf下deployerConfigContext.xml ,添加如下配置

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/pinyougoudb?characterEncoding=utf8"
p:user="root"
p:password="123456" />
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5"
p:characterEncoding="UTF-8" />
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="select password from tb_user where username = ?"
p:passwordEncoder-ref="passwordEncoder"/> 

引入 jar包依赖

将以下三个jar包放入webappscasWEB-INFlib下

 

用数据库中的用户名和密码进行测试,到这里最简单的单点登录就算完成了,但是扩展就得看源码。

今天突然感觉很无奈,感觉读源码能力需要去培养一下,目前是能力为0.

原文地址:https://www.cnblogs.com/hejj-bk/p/11308651.html