cas单点登录搭建

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

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

首先,我需要介绍一下,配置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>

复制代码

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

启动tomcat(需要修改端口号,要不然后报端口号被占用错误,这里修改为8111,当然你可以根据自己的爱好修改,对这里来说无关痛痒),将项目运行,启动成功后输入地址:localhost:8111/casDemo001/,出现如下界面

在这里插入图片描述

这就证明配置成功了,你的请求已经被拦截,并且正确的跳到了你的cas服务器登录界面,输入账号密码:casuser Mellon
在这里插入图片描述
然后刷新cas服务端的界面,出现如下图界面:
在这里插入图片描述

由于账号密码是固定的,所以接下来我们需要修改为数据库登录,我们要配置的是服务端的配置文件,所以,先进入部署了cas服务端的tomcat文件夹,找到webapps->cas->WEB-INF->deployerConfigContext.xml文件,如下图
在这里插入图片描述

打开文件,找到下图部分:

在这里插入图片描述

这一块就是cas的登录用户配置,里面依旧有一个默认的用户,就是casuser Mellon,所以我么要做的就是把这里变成数据库的配置啦,很简单,就是修改以上代码,变成:

复制代码

<bean id="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
        <property name="dataSource" ref="dataSource" />
        <property name="sql" value="select password from user where username = ?" />
    </bean>
    <!-- MySQL connector -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName">
        <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
        <value>jdbc:mysql://localhost:3306/cas</value>
        </property>
        <property name="username">
        <value>root</value>
        </property>
        <property name="password">
        <value>123456</value>
        </property>
    </bean>

复制代码

这里需要加入以下jar包(jar包可以去maven仓库寻找pom.xml依赖加入客户端工程,然后在你本地的maven仓库去寻找):

在这里插入图片描述

就这四个,添加至tomcat->webapps->cas->WEB-INF->lib,这样就ok啦。接下来做个测试吧,创建一个用户表,笔者这里有:

在这里插入图片描述

然后启动tomcat,输入地址:localhost:8111/casDemo01/,使用数据库用户进行登录,如图:
在这里插入图片描述
登陆后:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35500685/article/details/92796174