您的位置:首页 > 数据库

用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
(

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&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的博客

教程用到的文件和项目包
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息