CAS单点登录的配置

CAS 的结构体系

    CAS Server:负责完成对用户的认证工作, CAS Server 需要独立部署,有不止一种 CAS Server 的实现, Yale CAS Server 和 ESUP CAS Server 都是很不错的选择。

  

    CAS Client:当有对本地 Web 应用的受保护资源的访问请求,并且需要对请求方进行身份认证, Web 应用不再接受任何的用户名密码等类似的 Credentials ,而是重定向到 CAS Server 进行认证。

  

    CAS 协议

        CAS 是通过 TGT(Ticket Granting Ticket) 来获取 ST(Service Ticket) ,通过 ST 来访问服务,而 CAS 也有对应 TGT , ST 的实体,而且他们在保护 TGT 的方法上虽然有所区别,但是,最终都可以实现这样一个目的——免去多次登录的麻烦。

        当用户认证过程完成之后, CAS Server 会向 User 发送一个 Ticket granting cookie (TGC) 给 User 的浏览器,这个 Cookie 就类似 Kerberos 的 TGT ,下次当用户被 Helloservice2 重定向到 CAS Server 的时候, CAS Server 会主动 Get 到这个 TGC cookie ,然后做下面的事情:

如果 User 持有 TGC 且其还没失效,那么就允许用户访问服务 ,达到了 SSO 的效果。

如果 TGC 失效,那么用户还是要重新认证。

制作证书

    本范例使用JDK自带的证书生成工具keytool来生成证书,实际项目需要到专门的证书认证中心购买。

    步骤如下:

        1、在DOS窗口定位到jdk的bin目录下

        2、用keytool生成证书

            keytool -genkey -alias seasy-dp -keyalg RSA -keystore E:/seasy-dp

            注意:第一个问题的答案需要输入CAS系统的域名,比如cas.seasy.com

        3、导出证书

            keytool -export -file e:/seasy-dp.crt -alias seasy-dp -keystore e:/seasy-dp

        4、把证书导入到客户端JDK中

            keytool -import -alias seasy-dp -file "e:/seasy-dp.crt" -keystore "C:/jdk1.7.0_15/jre/lib/security/cacerts" -storepass seasy-dp

            证书需要导入到%JAVA_HOME%\jre\lib\security目录下

 

CAS服务端配置(使用tomcat_7.0.*)

     1、将生成的文件(seasy-dp和seasy-dp.crt)复制到Tomcat的根目录下,后续会用到这些文件

     2、解压cas-server-webapp-3.5.2.war到tomcat的webapps目录,并重命名为cas.war

     3、打开%TOMCAT_HOME%/conf/server.xml文件,进行以下配置

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" 
	SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
	enableLookups="false" acceptCount="100" disableUploadTimeout="true"
	clientAuth="false" sslProtocol="TLS"
	keystoreFile="D:/apache-tomcat-7.0.42/seasy-dp"
	keystorePass="seasy-dp" />

     4、浏览器访问 https://cas.seasy.com:8443/cas/login, 使用 admin / admin 登录系统

     5、登出系统 https://cas.seasy.com:8443/cas/logout

 

CAS客户端配置

     新建一个web工程,在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>CASFilter</filter-name>  
	<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>  
	<init-param>  
		<param-name>casServerLoginUrl</param-name>  
		<param-value>https://cas.seasy.com:8443/cas/login</param-value> 
	</init-param>  
	<init-param>  
		<param-name>serverName</param-name>  
		<param-value>http://localhost:9999</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://cas.seasy.com:8443/cas</param-value>  
	</init-param>  
	<init-param>
		<param-name>serverName</param-name>  
		<param-value>http://localhost:9999</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>
</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>

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

       web工程需要引入cas-client-core-3.2.1.jar、commons-logging-1.1.1.jar等jar包

 

异常总结:

报错:java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory

解决:在Eclipse的window > Preferences 的Servers > Tomcat > Tomcat 6.X > Paths > Prepend to classpath 加入D:\cjm\tools\apache-tomcat-7.0.42_2\bin\tomcat-juli.jar

报错:java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching cas.gsafc.com found

解决:在用keytool生成证书时,第一个问题的答案需要输入域名,且要与CAS系统域名要一致

报错:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

解决:证书需要导入到%JAVA_HOME%\jre\lib\security目录下。服务器的JDK版本号需要和生成证书所使用的JDK版本号一致。

 

后续补充:

      原理概述整理、SAS服务端连接真实的数据库

 

猜你喜欢

转载自chenjumin.iteye.com/blog/2306816