CAS认证实现单点登录一.背景有几个相对独立的java的web应用系统,各自有自己的登陆验证功能,用户在使用不同的系统的时候,需要登陆不同的系统。
现在需要提供一个统一的登陆/登出界面,而不修改各个系统原来的登陆验证机制。
于是采用单点登录系统开源单点登录产品CAS。
随着新的业务网站不断的增加,用户在每个应用系统中都有独立的账号,这样就造成在访问不同的应用系统时,需要记录对应的用户名和密码,多个用户名密码极易记混,如果忘记或记错了某一个业务网站的用户名或密码就无法进行登录,耽误工作,影响工作效率允许用户一次性进行认证之后,就访问系统中不同的应用二.原理CAS 是一个独立的web 应用, 当前使用Java Servlets 实现,通过HTTPS 协议保证其数据的传输安全性。
它通过三个Url 地址进行访问:登录Url、验证URL、注销URL。
三. CAS认证集成要使用单点登录,需要部署CAS系统,CAS服务端可以直接部署在tomcat下运行,对于CAS服务端来说,所有要集成单点登录的web应用都是它的一个客户端,CAS有客户端jar包,客户端web应用需要引入CAS客户端的jar包,这样CAS系统的服务端和客户端web应用程序端才能通信。
客户端web应用程序的通过配置web.xml,添加CAS需要的各种过滤器,来实现和CAS服务器通信,用户信息验证工作在CAS 服务端统一完成,验证通过后,客户端web应用程序只需要补全自己的Session信息即可。
3.1部署CAS系统服务端步骤1:准备好以下运行环境jdk1.6+tomcat6+jdk与tomcat的下载、安装、配置在此略过。
步骤2:安装部署cas-server到官网(/cas/cas-server-3.5.0-release.zip)下载cas-server-3.5.0-release.zip。
解压缩以后,在其路径 cas-server-3.5.0\modules 下面找到 cas-server-webapp-3.5.0.war,将其拷贝到 tomcat 的webapps 下,改名为 cas.war, 并修改 war 包中配置文件 cas.properties 里的 cas server name=cas 并启动 tomcat,启动后可在浏览器访问 http://localhost:8080/cas/login当出现如下界面时,说明 cas 服务器已经初步部署成功。
此时,还不能作为有效的单点登录服务器。
在实际使用的时候,还需要根据实际概况做扩展和定制,最主要的是扩展认证 (Authentication) 接口和 cas-server的界面(这部分内容以后再详述)。
其中红色部分提示当前登录的 cas 链接是不安全的,建议使用 https 协议。
步骤3:修改配置http协议等CAS默认需要tomcat配置SSL协议,使用https协议通信的。
由于项目是企事业单位内部的系统,不需要这么高的安全级别,可以简化操作,不走SSL协议。
修改下配置文件\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml,如下,将默认的true改成false即可。
清单1. ticketGrantingTicketCookieGenerator 配置修改cas\WEB-INF\spring-configuration\warnCookieGenerator.xml 配置文件,将p:cookieSecure="true”改为p:cookieSecure="false" ,改完后如下:清单2. warnCookieGenerator 配置修改deployerConfigContext.xml: 找到"HttpBasedServiceCredentialsAuthenticationHandler" bean 添加:p:requireSecure="false", 改完后如下:清单3. warnCookieGenerator 配置这样,在cas 服务器运行的时候,就可以只使用http 请求了,省去了HTTPS 协议的麻烦配置。
步骤4:加密方式修改及配置数据库连接修改配置文件cas\WEB-INF\deployerConfigContext.xml。
在authenticationHandlers中配置验证方式,我这里配置数据库查询语句来实现用户名和密码的验证。
[html]view plaincopy1.<property name="authenticationHandlers">2.<list>3. <!--4. | This is the authentication handler that authenticates services by means of callback via SSL, thereby validating5. | a server side SSL certificate.6. +-->7.<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"8.p:httpClient-ref="httpClient"/>9. <!--10. | This is the authentication handler declaration that every CAS deployer will need to change before deploying CAS11. | into production. The default SimpleTestUsernamePasswordAuthenticationHandler authenticates UsernamePasswordCredentials12. | where the username equals the password. You will need to replace this with an AuthenticationHandler that implements your13. | local authentication strategy. You might accomplish this by coding a new such handler and declaring14. | edu.someschool.its.cas.MySpecialHandler here, or you might use one of the handlers provided in the adaptors modules.15. +-->16. <!-- <bean17.class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"/> -->18.<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">19.<property name="sql"value="select password from userTable where userName=?"/>20.<property name="passwordEncoder"ref="passwordEncoder"/>21.<property name="dataSource"ref="dataSource"/>22.</bean>23.</list>24.</property>密码加密方法我这里使用MD5,配置passwordEncoder的bean[html]view plaincopy1.<bean id="passwordEncoder"class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"autowire="byName">2.<constructor-arg value="MD5"/>3.</bean>在配置一个名称为dataSource的数据源[html]view plaincopy1.<bean id="dataSource"class="org.logicalcobwebs.proxool.ProxoolDataSource">2.<property name="driver"value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>3.<property name="driverUrl"value="jdbc:sqlserver://localhost:1433;databaseName=testDB;"></property>4.<property name="user"value="sa"></property>5.<property name="password"value="123456"></property>6.<property name="maximumConnectionCount"value="100"></property>7.<property name="minimumConnectionCount"value="1"></property>8.</bean>数据源的配置根据自己的实际情况来配置,需要的jar如果lib下面没有,自己复制进去,不然数据源连不上报错。