用CAS实现SSO(单点登录)+数据库读取

来源:互联网 发布:sql update 多个where 编辑:程序博客网 时间:2024/05/16 14:24

用CAS实现SSO(单点登录)+数据库读取

1.什么是SSO,什么是CAS.
SSO即单点登录的意思,而CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法。

2.CAS认证原理。
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:这里写图片描述
CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。
另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。
3.了解证书
cas-server与cas-client通讯安全完全基于https,需要ssl证书,jdk的keytool工具生成的证书用于开发也是够的,当然正式上线的证书需要使用第三方认证的证书;这里介绍下cas开发的准备工作:keytool生成证书。SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socket layer(SSL)安全协议是由Netscape Communication公司设计开发。该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准,所以服务器需要使用ssl证书。
4.配置准备
本例使用环境:
java version “1.8.0_91”
tomcat 8.5.8
cas 4.2.7
java和tomcat自己下载,这里提供cas-server的项目包,并且该项目包可以连接数据库并进行验证。
5.实际操作
5.1创建密钥库
命令:

keytool -genkeypair -alias “castest” -keyalg “RSA” -keystore “D:\keys\castest.keystore”

这里写图片描述
5.2在tomcat导入密钥库
找到tomcat的安装目录,打开/conf/server.xml
找到AprLifecycleListener 这个监听类的配置,将SSLEngine修改为on

这里写图片描述
将AJP/1.3协议关闭掉(也就是直接注释掉)
这里写图片描述
导入密钥库


这里写图片描述
注意:上面的keystorePass所需要填写的是你刚才设置的秘钥库的密码,例如我之前设置的是1122330,所以这里也是填写1122330。如果填错会报错:

java.io.IOException:Keystore was tampered with, or password was incorrect
5.2部署cas服务器。
5.2.1导入数据库(采用mysql数据库,创建一个userdb数据库,并运行以下代码)

CREATE TABLE t_user (

id bigint(15) NOT NULL COMMENT’主键’,

account varchar(30) DEFAULT NULL COMMENT’账号’,

password varchar(255) DEFAULT NULL COMMENT’密码’,

valid tinyint(1) DEFAULT NULL COMMENT ‘是否有效’,

PRIMARY KEY(id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入两条数据

/*cj用MD5加密后是:28198b369067e88dab9fefe85484dbf4

world用MDT加密后是:7d793037a0760186574b0282f2f435e7 */

insert into t_user(id,account,password,valid) values (25019377879351296,’cj’,’28198b369067e88dab9fefe85484dbf4’,1),

(25019377879351297,’zhangsan’,’7d793037a0760186574b0282f2f435e7’,1);

5.2.2在deployerConfigContext.xml中增加dataSource




 <bean id = "queryDatabaseAuthenticationHandler" name="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">        <property name="passwordEncoder" ref="MD5PasswordEncoder"/> </bean><alias name="dataSource" alias="queryDatabaseDataSource" /><bean id="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource"  p:driverClass="com.mysql.jdbc.Driver"  p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/userdb?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"  p:user="root"  p:password="admin"  p:initialPoolSize="6"  p:minPoolSize="6"  p:maxPoolSize="18"  p:maxIdleTimeExcessConnections="120"  p:checkoutTimeout="10000"  p:acquireIncrement="6"  p:acquireRetryAttempts="5"  p:acquireRetryDelay="2000"  p:idleConnectionTestPeriod="30"  p:preferredTestQuery="select 1" /><!--end  从数据库中的用户表中读取 -->

这里写图片描述
5.2.3修改cas.properties配置文件
这里要注意一些点,cas服务端有一个cas.properties的配置文件,文件位置随意放。但是要在cas项目中修改它的文件目录,不然cas无法运行。
这里写图片描述
找到cas.properties后添加一下代码

cas.jdbc.authn.query.sql=select password from t_user where account=? and valid=true

这里写图片描述
到了这一步,你的cas服务器就可以运行了。
这里写图片描述
帐号密码都是cj
这里写图片描述
至此,cas服务器的搭建就已经完成。下面配置下casClient端。我们随便创建一个应用,然后打开web.xml
插入以下代码:

    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

    <filter-name>casSingleSignOutFilter</filter-name>    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>    <init-param>        <param-name>casServerUrlPrefix</param-name>        <!-- cas服务器的地址 -->        <param-value>https://localhost:8090/cas/</param-value>    </init-param>

    <filter-name>casSingleSignOutFilter</filter-name>    <url-pattern>/*</url-pattern>

    <filter-name>CASFilter</filter-name>    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>    <init-param>        <!--casServerLoginUrl:cas服务的登陆url -->        <param-name>casServerLoginUrl</param-name>        <param-value>https://localhost:8090/cas/login</param-value>    </init-param>    <init-param>        <!--serverName:本项目的ip+port -->        <param-name>serverName</param-name>        <param-value>http://localhost:8080/mytest</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>    <init-param> 
        <param-name>ignorePattern</param-name>         <!-- <param-value>/staticres/css/|/staticres/js/|/springAndCas/login$|/springAndCas/logout$</param-value>   -->        <param-value>/staticres/css/|/staticres/js/</param-value>    </init-param>

    <filter-name>CASFilter</filter-name>    <url-pattern>/*</url-pattern>

    <filter-name>casHttpServletRequestWrapperFilter</filter-name>    <filter-class>       org.jasig.cas.client.util.HttpServletRequestWrapperFilter    </filter-class>

    <filter-name>casHttpServletRequestWrapperFilter</filter-name>    <url-pattern>/*</url-pattern>

    <filter-name>casAssertionThreadLocalFilter</filter-name>    <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>

    <filter-name>casAssertionThreadLocalFilter</filter-name>    <url-pattern>/*</url-pattern>

 <!--******************单点登录CAS配置begin********************-->

接着修改cas服务器的src/service/HTTPSandIMAPS-10000001.json把
“serviceId” : “^(https|imaps)://.*”,
修改为
“serviceId” : “^(https|imaps|http)://.*”,

操作完毕,保存,测试下。我们访问
localhost:8080/mytest1
这个项目,如果没有登录,它就会跳到CAS登录服务器

这里写图片描述

用cj登录,登录成功。

这里写图片描述

至此,我们的教程到此结束。
本教程感谢CSDN博主:pucao_cug
我正是参考了它的教程。
以下是他提供的教程:
pucao_cug关于cas的博客
教程用到的文件和项目包