CAS是YALE大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法。它主要分为client和server端,server端负责对用户的认证工作,client端负责处理对客户端受保护的资源的访问请求,CAS的原理如下图所示:

上述的6个步骤解释如下:

1.用户通过browser请求cas client A端的资源。

2.client A端发现用户未登录(client没有收到ST),redirect到cas server,并且把用户请求服务的url发送给server;server发现用户浏览器中没有TGC(Ticket Granting Cookie),就跳转到登录页面。

3.用户在登录页面登录并登录成功。

4.server在用户的浏览器中设置一个TGC(Ticket Granting Cookie),并且在server端保存一个TGT(Ticket Granting Tciket),然后把用户重定向到{client A网址+ST(Service Ticket)},其中ST是由TGT生成的。

5.client A端通过GET的方法收到ST,向server端验证这个ticket的有效性,这一步主要是为了防止恶意用{client网址+杜撰的ST}来访问client A,所以虽然ST是server发送给client A的,client A仍然需要向server验证其有效性。

6.ticket有效,server端返回ticket对应的用户的用户名,client A端为用户提供请求的服务。

上述是未登录的用户访问client A的过程,用户通过以上步骤已经登录了CAS系统,此时他访问CAS系统中信任的client B端,是不用登录的,实现步骤如下:
1.1.用户通过browser请求cas client B端的资源。

2.client B端发现没有收到ST,redirect到cas server,并且把用户请求服务的url发送给server;server发现用户浏览器中有TGC(Ticket Granting Cookie),验证该TGC后,用server端存储的TGT生成一个ST。

3.server把用户重定向到{client B网址+ST(Service Ticket)}。

4.client B端通过GET的方法收到ST,向server端验证这个ticket的有效性.

5.ticket有效,server端返回ticket对应的用户的用户名,client B端为用户提供请求的服务,这样用户就不用再次登录就可以访问到client B了。

所以从上述过程中,可以看到client端既不能接触到用户的用户名密码,也不能接触到用户的凭证TGT或者TGC,它只做两件事情:如果用户的请求里有ST,那么就向服务器验证ST的有效性;如果用户的请求里没有ST,那么就把用户重定向到cas server;

cas server全权负责管理用户的用户名和密码,如果发现用户的浏览器里面有有效的TGC,就生成ST把用户重定向到client端;如果用户浏览器里面没有TGC或者TGC无效,就让用户重新登录,然后在用户的浏览器里面设置新的TGC。而server和用户浏览器之间的交互是https安全协议,这样就保证了用户的用户名密码的安全性。

本文记录server端的搭建过程。

1.安装JDK

2.搭建TOMCAT:

下载tomcat7.0

双击%TOMCAT_PATH%/bin/startup.bat启动tomcat

浏览器打开http://localhost:8080,若显示如下界面,则配置成功:

3.配置tomcat使用https协议

(1)生成安全证书

cd到%JAVA_HOME%/bin/目录下,执行一下命令

keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "g:\tomcat.keystore"

  其中"g:\tomcat.keystore"是保存生成证书的路径和名称。

  在接下来的操作中,要注意的是“您的名字和姓氏是什么?”这里要回答域名,比如我是在本机搭建tomcat,所以回答localhost,如下图所示:

  其他的随便填就好了,密码当然要记住,我这里用的是"tomcat"作为密码,后面配置的时候要用到的。

  上述命令执行完后就可以在g:\下看到证书tomcat.keystore了。

(2)配置tomcat

    在%TOMCAT_PATH%/conf下找到server.xml文件,定位到下面的代码上:

<!--
<Connector port="" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->

    去掉注释,然后把它修改成下面的代码:

 <Connector port="" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="G:\tomcat.keystore"
keystorePass="tomcat"
clientAuth="false" sslProtocol="TLS" />

各项的含义见下表:

然后在浏览器里面打开https://localhost:8443,出现如下界面就说明配置tomcat使用https成功了:

4.配置CAS Server

CAS主页上下载cas server,我这里下载的并不是最新版,是cas-server-3.5.2-release.zip;然后解压,到\cas-server-3.5.2\modules目录下找到cas-server-webapp-3.5.2.war,把它拷贝到\apache-tomcat-7.0.56\webapps下并且重命名为cas.war,重启tomcat(双击\apache-tomcat-7.0.56\bin\startup.bat),用浏览器打开https://localhost:8443/cas/login,如果出现一下界面则说明CAS Server配置成功:

5.与MYSQL连接

目前配置好的CAS的用户名和密码验证十分简单,既只要用户名和密码相同就可以登录了。但在实际应用中我们的用户名密码常常是保存在数据库里面的,所以我们希望实现从数据库里面验证用户名和密码。操作步骤如下:

(1)用phpMyAdmin在MYSQL中创建用户名密码的表,这里新建一个数据库casuserdatabase,创建一张表app_user来存放用户名密码信息,然后插入两条测试用的用户名密码,sql语句如下;

CREATE DATABASE casuserdatabase;
USE casuserdatabase;
CREATE TABLE app_user (username varchar(30), password varchar(45) , primary key (username));
INSERT INTO app_user (username,password) values ('test01','psw01');
INSERT INTO app_user (username,password) values('test02','psw02');

(2)到这里下载mysql-connector-java-5.1.22,其他版本的我没有尝试过,不知道可不可以。解压,我们只需要文件夹里面的mysql-connector-java-5.1.22-bin.jar包。

到cas-server-3.5.2\modules\目录下找到cas-server-support-jdbc-3.5.2.jar。

把上述两个包拷贝到apache-tomcat-7.0.56\webapps\cas\WEB-INF\lib\目录下。

(3)配置apache-tomcat-7.0.56\webapps\cas\WEB-INF\目录下的deployerConfigContext.xml文件:

首先增加一个datasource,通过增加一下的代码实现:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost/casuserdatabase"/>
<property name="username" value="sunshineatnoon"/>
<property name="password" value=""/>
</bean>

然后改变认证方式,定位到如下代码:

<bean                     
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

把它注释掉,换成:

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="select password from app_user where userName=?" />
</bean>

其中<property name="sql" value="select password from app_user where userName=?" /> 中app_user是我存放用户名和密码的表,需要根据实际情况而定。

注意这里datasource放在注释掉的那行代码所在的</list>外面,大概相对位置见下面的代码,否则会报错:

                <!--bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /-->
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="select password from app_user where userName=?" />
</bean>
</list>
</property>
</bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost/casuserdatabase"/>
<property name="username" value="sunshineatnoon"/>
<property name="password" value="49531218"/>
</bean>

(4)重启tomcat,再次到登录页面https://localhost:8443/cas/login上,就可以用数据库中的用户名和密码登录了,比如这里用上面设置的"test01","psw01"登录:

到这里还有个bug就是登录的时候总是会清空一次登录框,第二次才能登上去,研究下这个bug怎么解决再说。

还有一个是目前我还不知道怎么登出,于是就用最笨的方法,把浏览器的cookie删掉,刷新登录页面,就算登出啦。

参考资料

[1]配置tomcat使用https:http://ln-ydc.iteye.com/blog/1330674

[2]与mysql连接配置:http://blog.sina.com.cn/s/blog_3fc815b30100ihtr.html

[3]mysql-connector-java-5.1.22下载:http://6881116.blog.51cto.com/6871116/1190148

【Tech】单点登录系统CAS服务器端搭建及实现用户名密码由MYSQL数据库验证的更多相关文章

  1. 单点登录系统CAS筹建及取得更多用户信息的实现

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  2. java单点登录系统CAS的简单使用

    转:http://blog.csdn.net/yunye114105/article/details/7997041 背景 有几个相对独立的java的web应用系统, 各自有自己的登陆验证功能,用户在 ...

  3. 【Tech】单点登录系统CAS客户端demo

    服务器端配置请参考: http://www.cnblogs.com/sunshineatnoon/p/4064632.html 工具:myeclipse或者javaee-eclipse 1.启动jav ...

  4. 开源单点登录系统CAS入门

    一.什么是CAS CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以 ...

  5. springboot+shiro+cas实现单点登录之cas server搭建

    CAS是YALE大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法.它主要分为client和server端,server端负责对用户的认证工作,client端负责处理对客户端受保护 ...

  6. 单点登录系统cas资料汇总

    http://jasig.github.io/cas/4.0.x/index.html           主页 https://jasigcas.herokuapp.com              ...

  7. CAS单点登录系统入门--分布式登录验证

    1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...

  8. CAS单点登录系统整合——注册的问题

    最近一段时间在搞CAS单点登录系统,涉及到几个子系统的整合问题.对于注册,这里遇到了一个选择: 在子系统内完成注册,然后把信息同步到CAS系统: 在CAS系统中完成基本信息的注册,比如:用户名.邮箱. ...

  9. 单点登录系统(SSO)之CAS(中央认证服务)

    SSO(Single Sign On)单点登录系统,是在多个系统中值要求只要登录一次,就可以用已登录的身份访问多个系统,去掉了每次访问不同的系统都要重新登录的弊端. CAS(中央/集中认证服务):Th ...

随机推荐

  1. java.lang.IllegalStateException: class utils.filter.ContentFilter is not a javax.servlet.Filter

    1.错误描写叙述 2016-01-12 11:27:01.787:WARN:oejuc.AbstractLifeCycle:FAILED ContentFilter: java.lang.Illega ...

  2. SparseArray具体解释,我说SparseArray,你说要!

    可能在Android 中使用HashMap 的时候看到过提示. HashMap<Integer,Bitmap> mp = new HashMap<Integer,Bitmap> ...

  3. gstreamer 10.5版本发布啦

  4. python 爬虫5 Beautiful Soup的用法

    1.创建 Beautiful Soup 对象 from bs4 import BeautifulSoup html = """ <html><head& ...

  5. Android Otto框架浅析

    今天要介绍的是一个Android中使用得比較多的android 事件总线 EventBus模式的一个框架Otto. Otto 官网:http://square.github.io/otto/ 一.An ...

  6. js instanceof (2)

    instanceof运算符可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上.实例一:普遍用法 A instanceof B :检测B.prototype是否存在于参 ...

  7. 解决OV系列摄像头寄存器读数据无法收到的问题

    最近工作中接了一款OV7725的sensor,由于平台已经接过很多的家的sensor也就没有太当回事.问题出现的很奇怪,再看了 register map后基本确定了要尽心register  R/W测试 ...

  8. 服务器之ECC报错检查

    需要使用ipmitool工具 [root@Resource ~]# yum install ipmitool 首先查看是否有ecc报错 如下图: [root@Resource ~]# ipmitool ...

  9. Oracle SQL*Loader 数据导入工具

    SQL*Loader是一个向Orale大量倒数据的工具,可以从界定文件中导入数据如用 , 界定的,可以从定宽的文件导入数据,

  10. Unity3D delegate 用法

    delegate:委托机制,不做一一说明: 功能需求1: 音量,为一事件为B: 改变音量如为0,为事件A.也触发事件B: 音量变,所有音乐,如场景,特效,角色,打斗.其所有音量都得变.为C: 思路: ...