用CAS实现SSO(单点登录)+数据库读取
2017-09-07 17:20
495 查看
用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(
idbigint(15) NOT NULL COMMENT’主键’,
accountvarchar(30) DEFAULT NULL COMMENT’账号’,
passwordvarchar(255) DEFAULT NULL COMMENT’密码’,
validtinyint(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&characterEncoding=UTF-8&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> bed0 <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的博客
教程用到的文件和项目包
相关文章推荐
- CAS 实现单点登录(SSO)数据库查询认证机制-自定义编码方式(四)
- CAS 实现单点登录(SSO)数据库查询认证机制-xml方式(三)
- IT忍者神龟之基于CAS实现单点登录(SSO)之配置CAS服务端的数据库查询认证机制(一)
- Yale CAS + .net Client 实现 SSO(6)--自定义登录页面
- 基于CAS实现单点登录(SSO):工作原理
- IDEA-CAS-SSO单点登录-数据库
- CAS实现SSO(单点登录)
- CAS实现单点登录(SSO)经典完整教程
- spring + shiro + cas 实现sso单点登录
- CAS 实现单点登录(SSO)基本实现流程(一)
- 利用CAS之SSO模块实现单点登录认证
- SSO---CAS实现单点登录的HelloWorld
- SSO单点登录学习总结(3)—— 基于CAS实现单点登录实例
- CAS实现单点登录(SSO)经典完整教程
- CAS实现SSO单点登录原理介绍
- CAS 实现单点登录(SSO)简单实例demo(二)
- CAS实现单点登录(SSO)经典完整教程
- CAS实现单点登录(SSO)
- CAS实现单点登录(SSO)