基于CAS的SSO搭建详细图文
server.huweiqin.com =>> 对应部署cas server的tomcat,这个虚拟域名还用于服务端证书生成
client1.huweiqin.com =>> 对应部署client1客户端应用的tomcat
client2.huweiqin.com =>> 对应部署client2客户端应用的tomcat
1.生成证书
keytool -genkey -alias huwqsso -keyalg RSA -keysize 1024 -keypass huweiqin -validity 365 -keystore c:\huweiqin.keystore -storepass huweiqin
[说明]:-alias后面的别名可以自定义,-keypass指定证书**库的密码, -storepass和前面keypass密码相同,否则下面tomcat 配置https 会访问失败 -keystore指定证书的位置,这里指定放在c盘根目录,**库名称可以自定义..这里是huweiqin.keystore
【注意】:第一个让你输入的“您的名字与姓氏是什么”,请必须输入在C:\Windows\System32\drivers\etc\hosts文件中加入的服务端的域名.我这里也就是server.huweiqin.com,为何这么做?首先cas只能通过域名来访问,不能通过ip访问,同时上方是生成证书,所以要求比较严格,所以如果不这么做的话,及时最终按照教程配置完成,cas也可以正常访问,访问一个客户端应用虽然能进入cas验证首页,但是,当输入信息正确后,cas在回调转入你想访问的客户端应用的时候,会出现No subject alternative names present错误异常信息,这个错误也就是在上面输入的第一个问题答案不是域名导致、或者与hosts文件配置的不一致导致。
2.导出证书
keytool -export -alias huwqsso -keystore c:\huweiqin.keystore -file c:\huwqsso.crt -storepass huweiqin
【说明】:-alias后面的名称要与生成证书的命令里面的alias的名称一致. –keystore后面指定证书存放的位置,这里我放在C盘根目录,同时证书名称要与【生成证书】对应的命令里的keystore名称一致.这里是zhoubang.keystore,-file后面才crt路径,我也指定在c盘根目录. –storepass的证书密码要与上面输入的密码一致.
3.客户端导入证书
keytool -import -file c:\huwqsso.crt -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -alias huwqsso -trustcacerts
【说明】:-file指定证书的位置,也就是上一步导出证书的位置,即c:\ ssodemo.crt 命令中指定了JAVA_HOME,意思是将证书导入到客户端证书库,也就是jdk证书库中.因为客户端应用运行在本地,需要jdk的支持。
-trustcacerts 信任来自cacerts的证书
回车之后,会让你输入**库口令,注意,这里的密码必须要输入changeit,不能输入上面指定的密码zhoubang,切记,否则导入客户端证书会有问题,如果是多台机器演示,需要在每一台客户端导入该证书,步骤都是一样的。当看到提示“是否信任此证书”,输入y回车即可,见下图:(说明,命令中的-alias后面的别名可以自定义,如果出现【证书未导入,别名<***>已经存在】的错误,该意思是说客户端的**库中已经存在该别名证书了,重新指定其他别名即可.)
部署CAS-Server相关的Tomcat
1、配置HTTPS
解压apache-tomcat-7.0.57-windows-x64.zip,我本地路径为E:\apache-tomcat-7.0.57,编辑E:\apache-tomcat-7.0.57\conf\server.xml,找到下面片段:
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
去掉注释,修改成:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="C:/huweiqin.keystore" keystorePass="huweiqin"
clientAuth="false" sslProtocol="TLS" />
其中,keystoreFile就是创建证书的路径,keystorePass就是创建证书的密码
2、验证HTTPS配置
其他按照默认配置不作修改,双击E:\apache-tomcat-7.0.57\bin \startup.bat 启动tomcat 验证https是否配置成功,我本地使用火狐浏览器访问,在地址栏输入
https://server.huweiqin.com:8443/ 出现下面画面,其实这就表明cas服务端tomcat的https配置是没有问题了.
3、部署CAS-Server
CAS-Server 下载地址:http://www.jasig.org/cas/download
本文以cas-server-webapp-4.0.0.rar为例,解压提取cas-server-webapp-4.0.0.war文件,把改文件copy到E:\apache-tomcat-7.0.57\webapps 目下,并重命名为:cas.war.
启动tomcat,在浏览器地址栏输入:https://server.huweiqin.com:8443/cas ,回车,出现CAS服务端的登录验证首页:
【说明】:此时,CAS只是单独运行,至于登录的用户名和密码是什么,请查看:
E:\apache-tomcat-7.0.57\webapps\cas\WEB-INF\deployerConfigContext.xml文件中有这样一段配置:
<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>
这个配置是默认静态配置用户名和密码,那就在浏览器的CAS服务的登陆框中输入用户名casuser和密码Mellon,登录看看效果,就会出现验证成功的页面,如下图。你也可以在文件中自己配置自己的用户名和密码。
4、部署CAS客户端相关的Tomcat
使用tomcat默认自带的 webapps\examples 作为演示的简单web项目
本地解压了2份tomcat,作为客户端服务器
cas-client-core-3.2.1.jar、commons-logging.jar
首先,将上面2个jar分别放到E:\apache-tomcat-7.0.57-client1\webapps\examples\WEB-INF\lib目录
和E:\apache-tomcat-7.0.57-client2\webapps\examples\WEB-INF\lib目录
<Server port="18005" shutdown="SHUTDOWN">
<Connector port="18080" protocol="HTTP/1.1"
<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />
<Server port="28005" shutdown="SHUTDOWN">
<Connector port="28080" protocol="HTTP/1.1"
<Connector port="28009" protocol="AJP/1.3" redirectPort="8443" />
启动三个tomcat
http://client1.huweiqin.com:18080/examples/servlets/
看到上述界面表示apache-tomcat-7.0.57-client1的基本安装配置已经成功。
接下来需要配置最重要的内容,让客户端应用和CAS服务连接:
编辑E:\apache-tomcat-7.0.57-client1\webapps\examples\WEB-INF\web.xml,在最下面加入如下配置:
<!-- ======================== 单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<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>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://server.huweiqin.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client1.huweiqin.com:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://server.huweiqin.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client1.huweiqin.com:18080</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>
<!-- ======================== 单点登录结束 ======================== -->
修改编辑E:\apache-tomcat-7.0.57-client2\webapps\examples\WEB-INF\web.xml文件,加入的内容就是上面在第一个客户端的web.xml内容一致,只不过需要修改2处内容,就是几个url地址, 最终的配置如下:
<!-- ======================== 单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<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>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://server.huweiqin.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client2.huweiqin.com:28080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://server.huweiqin.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://client2.huweiqin.com:28080</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>
<!-- ======================== 单点登录结束 ======================== -->
启动全部
http://client1.huweiqin.com:18080/examples/servlets/servlet/HelloWorldExample
http://client2.huweiqin.com:28080/examples/servlets/servlet/HelloWorldExample
换成自己的数据库连接
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
<!-- 指定c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/huwqsso?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull" />
<property name="user" value="root" />
<property name="password" value="root" />
</bean>
<!-- 访问本地数据库 -->
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource"></property>
<property name="sql" value="select password from user where account = ?"></property>
</bean>
错误1:不能加中文
错误2:不能直接用;
错误 3:jdbc连接不能用username要用user
另外还可修改登录注销的界面样式,这里只是讲了一整个搭建过程