最近公司的一个项目须要用到单点登陆的功能,以前对单点登陆了解得很少。因而网上找了下单点登陆的解决方案,发现CAS是个不错的解决方案。因而搭个环境测试了一下。这里记录下测试的详细步骤。java
官网:http://jasig.github.io/cas/mysql
Cas Server下载:http://developer.jasig.org/cas/git
Cas Client下载:http://developer.jasig.org/cas-clients/github
测试环境:web
jdk:java version "1.8.0_60"sql
tomcat:apache-tomcat-7.0.65数据库
mysql:mysql5.5.40apache
CAS Server:cas-server-4.0.0-release.ziptomcat
CAS Client:cas-client-3.1.12-release.zip服务器
此教程是在jdk和tomcat成功安装的基础上完成,至于jdk和tomcat的安装你们能够网上找找资料。好吧,下面入正题。
1、生成证书
一、生成证书:
keytool -genkey -alias castest -keyalg RSA -keystore F:/keys/castest
生成一个别名为castest的证书。
此处须要特别注意口令(后续导入导出证书、CAS服务器端均要用到此口类)和“名字与姓氏”(为CAS跳转域名,不然会报错)
二、导出证书:
keytool -export -file F:/keys/castest.crt -alias castest -keystore F:/keys/castest
三、将证书导入到客户端JRE中(注意、是导入JRE中),若是security中已经存在cacerts,须要先将其删除。
keytool -import -keystore "D:\Program Files\Java\jdk1.8.0_60\jre\lib\security\cacerts" -file F:/keys/castest.crt -alias castest
2、配置服务器端
一、从http://developer.jasig.org/cas/上下载cas服务器端cas-server-4.0.0-release.zip,在modules目录下找到cas-server-webapp-4.0.0.war,将其复制到%TOMCAT_HOME%\webapps下,并将名称改成cas.war
二、修改%TOMCAT_HOME%\conf\server.xml文件,去掉此文件83到93行之间的注释,修改成:
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="F:/keys/castest" <!—生成证书时的路径,证书名--> keystorePass="castest" <!—证书密码--> maxThreads="150" port="8443" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>
三、测试:https://localhost:8443/
点击继续浏览此网页
若是此时能够正常访问,说明证书安装成功
https://localhost:8443/cas/login,出现
输入帐号和密码
casuser
Mellon
此时说明服务器端已经配置成功。可经过https://localhost:8443/cas/logout退出登陆
3、配置客户端
1. 从http://developer.jasig.org/cas-clients/上下载cas-client-3.1.12-release.zip,在modules目录下找到cas-client-core-3.1.12.jar、commons-collections-3.2.jar、commons-logging-1.1.jar复制到项目WEB-INF/lib下
2. 添加映射域名,在C:\Windows\System32\drivers\etc\hosts文件中添加
127.0.0.1 sso.castest.com
3. 建立web项目CasClient,并在项目的web.xml配置过滤器
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>cas-demo</display-name> <!-- ======================== 单点登陆开始 ======================== --> <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置--> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <!-- 该过滤器用于实现单点登出功能,可选配置。 --> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/CasClient/*</url-pattern> </filter-mapping> <!-- 该过滤器负责用户的认证工做,必须启用它 --> <filter> <filter-name>CASFilter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>https://sso.castest.com:8443/cas/login</param-value> <!--这里的server是服务端的IP--> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080</param-value> </init-param> </filter> <filter-mapping> <filter-name>CASFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 该过滤器负责对Ticket的校验工做,必须启用它 --> <filter> <filter-name>CAS Validation Filter</filter-name> <filter-class> org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>https://sso.castest.com:8443/cas/</param-value><!-- 此处必须为登陆url/cas/,带有任何其它路径都会报错,如“https://sso.castest.com:8443/cas/login”,这样也会报错。 --> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080</param-value> </init-param> </filter> <filter-mapping> <filter-name>CAS Validation Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 好比容许开发者经过HttpServletRequest的getRemoteUser()方法得到SSO登陆用户的登陆名,可选配置。 --> <filter> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <filter-class> org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 该过滤器使得开发者能够经过org.jasig.cas.client.util.AssertionHolder来获取用户的登陆名。 好比AssertionHolder.getAssertion().getPrincipal().getName()。 --> <filter> <filter-name>CAS Assertion Thread Local Filter</filter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Assertion Thread Local Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- ======================== 单点登陆结束 ======================== --> <!-- session超时定义,单位为分钟 --> <session-config> <session-timeout>2</session-timeout> </session-config> </web-app>
4. 此时访问http://localhost:8080/CasClient/Index.jsp时会自动跳转到sso.castest.com下去登陆
输入帐号和密码casuser:Mellon
此时客户端已安装成功。
能够用相似的方式新建多个站点,站点1登陆之后站点而无需登陆也可访问,若是未登陆则会跳转到相应的url进行登陆验证。
至此,简单的服务器搭建已经完成了。然而,此时用户的验证是经过配置文件cas\WEB-INF\deployerConfigContext.xml中指定用户名和密码的方式进行验证的。显然这不知足咱们平常的需求,今天先介绍到这。下面再另行介绍经过mysql数据库验证的方式。