CAS实现SSO单点登录

环境
cas-server-4.1.8,cas-client-3.4.0,Java-8,Maven-3,Tomcat-7.0.72

CAS Server 安装
点此进入 CAS 下载列表,选择下载 cas-4.1.8.zip。

解压缩 cas-4.1.8.zip 并进入 cas-server-webapp 目录,在当前目录打开 cmd 并执行安装命令。

mvn -e -ff clean install -Dmaven.test.skip=true
经亲身测试(自己拉的电信12M网络),该安装过程非常漫长,主要因为镜像原因导致依赖包下载非常慢,此过程需静心等待。或直接下载我已经打好包的 cas.war 文件(注:该文件的依赖包版本有稍做修改,此不影响正常使用)。

安装完成后,在 cas-server-webapp/target 目录下可以看到 cas.war 文件,该文件便是 cas server 应用服务的 war 包。

cas server 安全认证是基于 https 的,这里使用 JDK 自带的 keytool 工具生成数字证书,生产环境系统的应用需要到证书提供商处购买证书。证书的生成及 Tomcat 的配置

首先确保 Tomcat 的 https 可以正常访问,将 cas.war 文件拷贝到 apache-tomcat-7.0.72/webapps 下进行发布,启动 Tomcat,访问 https://www.fanlychie.com:8443/cas


上图是用火狐浏览器打开的链接,选择高级 -> 添加例外 -> 确认安全例外。


用户名和密码在 apache-tomcat-7.0.72/webapps/cas/WEB-INF/deployerConfigContext.xml 配置文件中,找到并打开该文件,大概在 105 行

<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon" />
</map>
</property>
</bean>

可以看到默认的用户名是 casuser,密码是 Mellon。

看到上图的页面,表明 cas server 已经部署成功。

CAS Server 配置基于数据库用户认证

回到 cas-4.1.8.zip 解压缩的目录,并进入 cas-server-support-jdbc 目录,在当前目录打开 cmd 并执行安装命令

1
mvn -e -ff clean install -Dmaven.test.skip=true
安装完成后在 target 目录得到 cas-server-support-jdbc-4.1.8.jar 文件。

将该文件拷贝到 apache-tomcat-7.0.72/webapps/cas/WEB-INF/lib 目录下,并向此目录添加 c3p0-0.9.1.2.jar,mysql-connector-java-5.1.17.jar 两个文件。嫌麻烦的话,点此下载这三个 jar 包的压缩包文件。

再次打开 apache-tomcat-7.0.72/webapps/cas/WEB-INF/deployerConfigContext.xml 文件,大概在第 54 行。

<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
????<constructor-arg>
????????<map>
????????????<!--
???????????????| IMPORTANT
???????????????| Every handler requires a unique name.
???????????????| If more than one instance of the same handler class is configured, you must explicitly
???????????????| set its name to something other than its default name (typically the simple class name).
???????????????-->
????????????<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
????????????<!-- 注销此项
????????????<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
????????????-->
????????????<!-- 添加此项 -->
????????????<entry key-ref="myAuthenticationHandler" value-ref="primaryPrincipalResolver" />
????????</map>
????</constructor-arg>
????<!-- Uncomment the metadata populator to capture the password.
????<property name="authenticationMetaDataPopulators">
???????<util:list>
???????????<bean class="org.jasig.cas.authentication.CacheCredentialsMetaDataPopulator"/>
???????</util:list>
????</property>
????-->
????<!--
???????| Defines the security policy around authentication. Some alternative policies that ship with CAS:
???????|
???????| NotPreventedAuthenticationPolicy - all credential must either pass or fail authentication
???????|
AllAuthenticationPolicy - all presented credential must be authenticated successfully
???????| * RequiredHandlerAuthenticationPolicy - specifies a handler that must authenticate its credential to pass
???????-->
????<property name="authenticationPolicy">
????????<bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
????</property>
</bean>

按以上配置注销掉第二个 entry 并添加一个 entry。接着在后面添加两个 bean 配置。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/cas_test_db?autoReconnect=true&useUnicode=true&characterEncoding=utf-8" />
<property name="user" value="root" />
<property name="password" value="root" />
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="initialPoolSize" value="10" />
<property name="maxIdleTime" value="1800" />
<property name="maxPoolSize" value="60" />
<property name="acquireIncrement" value="5" />
<property name="acquireRetryAttempts" value="60" />
<property name="acquireRetryDelay" value="2000" />
<property name="breakAfterAcquireFailure" value="false" />
<property name="autoCommitOnClose" value="false" />
<property name="checkoutTimeout" value="30000" />
<property name="idleConnectionTestPeriod" value="900" />
</bean>
<bean id="myAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="SELECT passwd FROM user WHERE name = ?" />

其中 cas_test_db 数据库中的 user 建表语句为

CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
passwd varchar(255) NOT NULL,
PRIMARY KEY (id)
)

重启 Tomcat,访问 https://www.fanlychie.com:8443/cas,用数据库中的 name/passwd 作为用户名和密码登录系统,若登录成功,表明配置已成功。

CAS Client 客户端使用和配置
使用 maven 创建两个 web 项目 cas-client1,cas-client2。点此下载 demo 文件。

cas-client1 项目 pom.xml 配置

<dependencies>
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<port>8881</port>
<httpsPort>8081</httpsPort>
<uriEncoding>UTF-8</uriEncoding>
<protocol>org.apache.coyote.http11.Http11NioProtocol</protocol>
<clientAuth>false</clientAuth>
<keystoreFile>C:\Users\fanlychie.keystore\selfissue.jks</keystoreFile>
<keystorePass>123654</keystorePass>
<keystoreType>JKS</keystoreType>
<url>http://localhost:8081/manager/html</url&gt;
</configuration>
</plugin>
</plugins>
</build>

首先必须确保项目 https 协议可以正常访问,否则 cas server 无法认证。

选中项目 -> Run As -> Maven build… -> tomcat7:run

访问 https://www.fanlychie.com:8081,若能访问到,表明 Tomcat 已准备好。

cas-client1 项目 web.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

&lt;filter&gt;
    &lt;filter-name&gt;CAS Single Sign Out Filter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.jasig.cas.client.session.SingleSignOutFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;casServerUrlPrefix&lt;/param-name&gt;
        &lt;!-- 此处配置的是 cas server 地址 --&gt;
        &lt;param-value&gt;https://www.fanlychie.com:8443/cas&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;CAS Single Sign Out Filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;

&lt;filter&gt;
    &lt;filter-name&gt;CAS Authentication Filter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.jasig.cas.client.authentication.AuthenticationFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;casServerLoginUrl&lt;/param-name&gt;
        &lt;!-- 此处配置的是 cas server 登录地址 --&gt;
        &lt;param-value&gt;https://www.fanlychie.com:8443/cas/login&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;serverName&lt;/param-name&gt;
        &lt;!-- 此处配置的是当前项目地址, 且必须使用 https 服务, 否则 cas server 无法认证 --&gt;
        &lt;param-value&gt;https://www.fanlychie.com:8081&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;CAS Authentication Filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;filter&gt;
    &lt;filter-name&gt;CAS Validation Filter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;casServerUrlPrefix&lt;/param-name&gt;
        &lt;!-- 此处配置的是 cas server 地址 --&gt;
        &lt;param-value&gt;https://www.fanlychie.com:8443/cas&lt;/param-value&gt;
    &lt;/init-param&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;serverName&lt;/param-name&gt;
        &lt;!-- 此处配置的是当前项目地址, 且必须使用 https 服务, 否则 cas server 无法认证 --&gt;
        &lt;param-value&gt;https://www.fanlychie.com:8081&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;CAS Validation Filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;filter&gt;
    &lt;filter-name&gt;CAS HttpServletRequest Wrapper Filter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.jasig.cas.client.util.HttpServletRequestWrapperFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;CAS HttpServletRequest Wrapper Filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;filter&gt;
    &lt;filter-name&gt;CAS Assertion Thread Local Filter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.jasig.cas.client.util.AssertionThreadLocalFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;CAS Assertion Thread Local Filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;welcome-file-list&gt;
    &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;
&lt;/welcome-file-list&gt;

</web-app>

以上是 cas client 标准配置

cas-client2 配置基本与 cas-client1 配置相同,详情可见 demo,同时启动这两个项目

cas-client1 - https://www.fanlychie.com:8081
cas-client2 - https://www.fanlychie.com:8082
访问其中的一个项目 https://www.fanlychie.com:8081,会自动跳到

https://www.fanlychie.com:8443/cas/login?service=https%3A%2F%2Fwww.fanlychie.com%3A8081%2F

由于还没有登录过 CAS 认证系统,CAS 认证系统拦截到你的访问,进入到认证系统登录界面,当登录成功后,CAS 服务会跳转向到你刚刚访问的地址。

当你访问 https://www.fanlychie.com:8082,此时是不需要登录了的

至此,CAS 实现 SSO 单点登录系统搭建结束

原文地址:http://blog.51cto.com/13932491/2301366

时间: 2024-08-01 02:11:54

CAS实现SSO单点登录的相关文章

学习CAS实现SSO单点登录

网上找了几篇比较详细的教程,在这记录一下: 原理: CAS实现SSO单点登录原理 教程: 1.CAS实现单点登录(SSO)经典完整教程 2.SSO之CAS单点登录实例演示 3.CAS单点登录(SSO)完整教程 有可能出现的问题解决方案: 1.unable to find valid certification path to requested target javax.net.ssl.SSLHandshakeException: sun.security.validator.Validator

CAS实现SSO单点登录原理

1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO ). CAS 开始于 2001 年, 并在 2004 年 12 月正式成为 JA-SIG 的一个项目. 1.2.  主要特性 1.   开源的.多协议的 SSO 解决方案: Protocols : Custom Protoc

CAS实现SSO单点登录原理(转)

1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO ). CAS 开始于 2001 年, 并在 2004 年 12 月正式成为 JA-SIG 的一个项目. 1.2.  主要特性 1.   开源的.多协议的 SSO 解决方案: Protocols : Custom Protoc

基于CAS的SSO(单点登录)实例

第一步 部署CAS-Server(服务端) 1.从CAS官方网站(http://developer.jasig.org/cas/)下载最新版本的CAS-Server(当前最新版本cas-server-4.0.0-release.zip),将其解压,找到modules/cas-server-webapp-3.5.2.war,复制到本地tomcat下的webapps下,并重命名为cas.war(可以是其他名称),启动tomcat,在webapps下生成了名为cas的web项目. 2.CAS默认使用h

cas sso单点登录系列4_cas-server登录页面自定义修改过程(jsp页面修改)

转:http://blog.csdn.net/ae6623/article/details/8861065 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标: 下面是正文: 打开cas的默认首页,映入眼帘的是满眼的中文and英文混杂体,作为一名合格的用户,我表示很不开心. 于是,打开 Nodepad++,寻找C:\tomcat7\webapps\casServer\WEB-INF\view\jsp\default\ui \casLoginView.jsp这个页

CAS SSO单点登录框架介绍

1.了解单点登录  SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多个) 3) SSO 认证中心(一个) 2.SSO 实现包含以下三个原则 1) 所有的登录都在 SSO 认证中心进行. 2) SSO 认证中心通过一些方法来告诉 Web 应用当前访问用户究竟是不是通过认证的用户. 3) SSO 认证中心和所有的 Web 应用建立一种信任关系. 3.了解单点登录体系结

CAS SSO单点登录框架学习

1.了解单点登录  SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多个) 3) SSO 认证中心(一个) 2.SSO 实现包含以下三个原则 1) 所有的登录都在 SSO 认证中心进行. 2) SSO 认证中心通过一些方法来告诉 Web 应用当前访问用户究竟是不是通过认证的用户. 3) SSO 认证中心和所有的 Web 应用建立一种信任关系. 3.了解单点登录体系结

CAS SSO单点登录实例

1.因为是本地模拟sso环境,而sso的环境测试需要域名,所以需要虚拟几个域名出来,步骤如下: 2.进入目录C:\Windows\System32\drivers\etc 3.修改hosts文件 127.0.0.1 jeesz.cn 127.0.0.1 sso1.jeesz.cn 127.0.0.1 sso2.jeesz.cn 4.生成认证证书 注意:我们可以根据sso单点登录的架构图可以看到,在客户端和服务端进行交互的时候,是需要认证的,在这里我们使用jdk中的keytool方案生成证书(一般

[精华][推荐]CAS SSO单点登录服务端客户端实例

1.因为是本地模拟sso环境,而sso的环境测试需要域名,所以需要虚拟几个域名出来,步骤如下: 2.进入目录C:\Windows\System32\drivers\etc 3.修改hosts文件 127.0.0.1 jeesz.cn 127.0.0.1 sso1.jeesz.cn 127.0.0.1 sso2.jeesz.cn 4.生成认证证书 注意:我们可以根据sso单点登录的架构图可以看到,在客户端和服务端进行交互的时候,是需要认证的,在这里我们使用jdk中的keytool方案生成证书(一般