cas单点登陆学习:cas服务端与客户端的搭建

单点登陆:英文名称(Single Sign On),简称sso,是目前比较流行的服务于企业业务整合的解决方案之一,SSO 使得在多个应用系统中,用户只须要登陆一次就能够访问全部相互信任的应用系统html

 

而后,引用段话介绍一下cas特性(详见http://www.360doc.com/content/15/0204/17/21706453_446251626.shtml):java

1) 开源的、多协议的SSO解决方案,CAS ServerCAS Client通讯支持多协议,如:CASOauthOpenIDSAML1.1SAML2.0D等。web

2) 支持多种认证机制:Active Directory、JAASJDBCLDAPX.509 Certificateswindows

3) 安全策略:使用票据(Ticket)来实现支持的认证协议;api

4) 支持多种客户端:Java.NetPHPPerlApache、 uPortal等。tomcat

5) 支持受权:能够决定哪些服务能够请求和验证服务票据(Service Ticket安全

6)  提供高可用性:经过把认证过的状态数据存储在TicketRegistry组件中,这些组件有不少支持分布式环境的实现服务器

 

CAS包含CAS ServerCAS Client两个部分。下面咱们看一看他的运行原理,首先借用一张cas经常使用的基础协议流程图session

大体流程是,在客户机在在访问cas客户端时都须要请求服务端惊醒身份验证,再验证未经过是时,会被重定向至cas的服务端进行登录,然后再次验证,经过以后又重定向到客户端界面。这里只是一些文字描述,真正的实现咱们接下来看如何操做:app

首先,我须要介绍一下,配置cas的服务端有两种方式:一种是http方式,另外一种是https方式。笔者这里将演示如何配置https方式的cas服务端。

第一步咱们确定是须要准备咱们的原材料:笔者这里用的是cas-server-4.0.7.war,tomcat7

首先须要的是导出你的证书,使用jdk的keytool工具,命令以下:

 

keytool -genkey -alias castest -keyalg RSA -keystore C:/key/casKey.keystore

 

 这里是生成你的keystore文件,C:/key/casKey.keystore是指文件生成路径,即c盘下的key文件夹下生成casKey.store文件,注意文件夹必定要存在这里你会输入你的证书信息,注意口令为你的密码,用户名将为你后期配置服务端请求的域名

 

 

第二步导出crt文件:

keytool -export -file C:/key/casKey.crt -alias castest -keystore C:/key/casKey.keystore

 

执行完这两步,你将生成两个文件:

第三步:将生成的证书导入你的运行jdk中:

keytool -import -keystore "C:/Program Files/Java/jdk1.8.0_131/jre/lib/security/cacerts" -file C:/key/casKey.crt -alias castest

 

这里须要注意的是你的路径必定要为你的jdk->jre->lib->security,若是你的路径下存在此文件,则须要将其删除,再执行导入,密钥库口令默认为changeit

而后将生成的证书文件文件拷贝至jdk->bin下,在c://windows/System32/drivers/etc/hosts文件中添加你的域名映射,没有该文件需建立一个hosts文件,添加内容以下

127.0.0.1 sso.castest.com

 

 接下来就开始配置tomcat环境了,首先将你的cas-server-4.0.7.war拷贝至tomcat的webapps下,更名为cas.war。打开tomcat->conf->server.xml,找到以下内容:

将其反注释,修改成:

<Connector port="8086" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" keystoreFile="C:/key/casKey.keystore" keystorePass="casDemo" />

 

 这里须要注意:keystoreFile为你第一步生成的keystore文件的位置,keystorePass为你第一步输入的口令密码,不是changeit

接下来作个测试,启动tomcat,输入地址https://sso.castest.com:8086/cas/,出现以下界面

添加好信任以后,进入以下界面,则说明服务端配置成功:

ok,以上步骤若是没有成功,请仔细检查以前步骤。成功了以后,恭喜,那就能够进入客户端端的配置了,首先,下载服务端架包,这里用的是cas-client-core-3.2.1.jar,而后准备一个测试tomcat,用来测试单点登陆,建立一个web项目,取名为casDemo001

pom.xml加入以下:

<dependency>
        <groupId>org.jasig.cas.client</groupId>
        <artifactId>cas-client-core</artifactId>
        <version>3.2.1</version>
    </dependency>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections --> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>

 

 web.xml文件以下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <!-- ======================== 单点登陆开始 ======================== -->
    <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

    <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
    <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>

    <!-- 该过滤器负责用户的认证工做,必须启用它 -->
    <filter>
        <filter-name>CASFilter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>https://sso.castest.com:8086/cas/login</param-value>
        </init-param>
        <!--
            指定客户端的域名和端口,是指客户端应用所在机器而不是 CAS Server 所在机器如下配置表示,
            系统部署在域名为shirui-55的机器上,端口为80 
        -->
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://localhost:8111</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>
            <param-value>https://sso.castest.com:8086/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://localhost:8111</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>
    
        
        <!-- ======================== 单点登陆结束 ======================== -->

        <!-- session超时定义,单位为分钟 -->
        <session-config>
                <session-timeout>2</session-timeout>
        </session-config>

</web-app>
        

 

 这里需注意的是关于两个casServer的url的编写

启动tomcat(须要修改端口号,要否则后报端口号被占用错误,这里修改成8111,固然你能够根据本身的爱好修改,对这里来讲无关痛痒),将项目运行,启动成功后输入地址:localhost:8111/casDemo001/,出现以下界面

这就证实配置成功了,你的请求已经被拦截,而且正确的跳到了你的cas服务器登陆界面,输入帐号密码:casuser     Mellon(这是cas默认的登陆帐户,配置数据验证的话下一篇博文会讲述),登录后出现以下界面:

 

 

 

 

而后刷新cas服务端的界面,出现以下图界面:

 

至此,cas服务端与客户端的配置已经完成,服务端文件下载连接连接:https://pan.baidu.com/s/1qY1H0aK    密码:7e52

相关文章
相关标签/搜索