CAS单点登录学习笔记

来源:互联网 发布:航天科工智慧 java 编辑:程序博客网 时间:2024/05/22 07:53

1、 创建证书:

创建文件夹d:\cas\keys,用于存放证书文件(必须先创建文件夹)

以管理员身份运行命令行控制台,进入java的jre\bin目录

cd D:\Software\Java\jre1.8.0_73\bin

执行如下命令:

keytool -genkey -alias castest -keyalg RSA -keysize 2048-keystore d:/cas/keys/castest.keystore


此步完成后会在d:\cas\keys目录中找到castest.keystore

 

2、 导入证书

继续执行命令:

keytool -export -file d:/cas/keys/castest.crt -aliascastest -keystore d:/cas/keys/castest.keystore


此步完成后可在D:/cas/keys文件夹下找到castest.crt文件

 

3、 客户端JVM导入证书

进入JDK安装目录

cd D:\Software\Java

执行如下命令:

keytool -import -keystore D:\Software\Java\jre1.8.0_73\lib\security\cacerts -file d:/cas/keys/castest.crt -alias castest



如果要删除证书执行此命令(管理员身份运行):

keytool -delete -alias castest -keystore"%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit

查看证书列表: keytool -list -keystoreD:\Software\Java\jre1.8.0_73\lib\security\cacerts

 

4、    证书应用到tomcat,我这里使用tomcat6.0.29

打开tomcat的conf\server.xml,启用83和87行的注释代码,设置keystoreFile、keystorePass,启用Web服务器(Tomcat)的SSL,也就是HTTPS加密协议

修改后的代码如下:

<Connector port="8443"protocol="HTTP/1.1" SSLEnabled="true"

               maxThreads="150"scheme="https" secure="true"

               clientAuth="false"sslProtocol="TLS"

                       keystoreFile="D:/cas/keys/castest.keystore"keystorePass="123456" />

参数说明:

keystoreFile:第一步创建key存放的位置

keystorePass:创建证书时的密码

 

使用tomcat7及以上,会报错:

java.lang.Exception: Connector attribute SSLCertificateFilemust be defined whe n using SSL with APR

是因为7及以上的多了个dll文件,6的默认使用JSSE实现,而7.0默认使用APR实现。由于习惯使用6.0的配置方式(即JSEE实现),因此只要把conf\server.xml里的protocol修改一下就行了:   

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"SSLEnabled="true"

               maxThreads="150"scheme="https" secure="true"

               clientAuth="false"sslProtocol="TLS"

                       keystoreFile="D:/cas/keys/castest.keystore"keystorePass="123456" />

 

5、 修改host文件

打开文件C:\Windows\System32\drivers\etc\hosts

第一步设置的域名IP指向。

 

6、 测试是否成功

启动tomcat,浏览器中输入https://sso.test.com:8443


然后就是tomcat的首页了

 

7、 CAS Server端配置

下载cas-serve -4.0.0 (http://www.ja-sig.org/downloads/cas/),解压之后进入目录D:\cas-server-4.0.0\modules,复制cas-server-webapp-4.0.0.war到tomcat的webapps目录下,最好改名为cas.war,方便输入URL


在浏览器中输入:https://sso.test.com:8443/cas/login,或者https://localhost:8443/cas/login

看见CAS默认登录页面,

 

找到配置文件deployerConfigContext.xml的bean:primaryAuthenticationHandler,定义了用户名和密码,可以修改用户名密码,我的如下:


登录成功

 

8、 更改默认语言

从图中可以看到,上面默认的是英文,我们改成中文。进入D:\apache-tomcat-6.0.29\webapps\cas\WEB-INF\classes,将message.properties重命名message_bak.properties(保留),复制messages_zh_CN.properties,重命名为message.properties,即可。重启tomcat,看到登录页已经是中文。

 

9、 配置数据库读取用户信息

编辑器打开D:\apache-tomcat-6.0.29\webapps\cas\WEB-INF目录下的deployerConfigContext.xml,

注释掉primaryAuthenticationHandler这个bean,然后配置数据源如下(castest是我用来演示的数据库):

<bean id="dataSource"

          class="com.mchange.v2.c3p0.ComboPooledDataSource"

          p:driverClass="com.mysql.jdbc.Driver"

          p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/castest?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"

           p:user="root"

           p:password="root" />

<beanid="primaryAuthenticationHandler"

                    class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"

                     abstract="false"

                     lazy-init="default"autowire="default" >

                     <property name="tableUsers">

                            <value>account</value>

                     </property>

                     <property name="fieldUser">

                            <value>username</value>

                     </property>

                     <propertyname="fieldPassword">

                            <value>password</value>

                     </property>

                     <property name="dataSource"ref="dataSource"/>

</bean>

上面的dataSource指定了数据源,需要在lib中加入c3p0-0.9.1.2.jar、mysql-connector-java-5.1.27.jar。

primaryAuthenticationHandler定义了用户验证规则,从dataSource读取表account中的用户数据。username是用户名,可以是其他名字,会映射成默认的“username”, password是密码,也可以是其他名字,会映射成默认的“password”,除了使用SearchModeSearchDatabaseAuthenticationHandler类,还可以使用QueryDatabaseAuthenticationHandler,其验证方式如下:

<beanid="dbAuthHandler"

      class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"

      <propertyname="dataSource" ref="dataSource"/>

<property name="sql" ref="select password fromaccount where username=? "/>

</bean>

效果跟使用SearchModeSearchDatabaseAuthenticationHandler类是一样的。必须注意,需要导入modules中的cas-server-support-jdbc-4.0.0.jar

然后重启tomcat,可以用数据库中的用户名密码登陆了。

 

10、             客户端集成sso进行单点登录

下载cas-client-3.3.3-release,下载地址http://www.ja-sig.org/downloads/cas-clients,解压缩文件,在modules目录下找到cas-client-core-3.3.3.jar,复制到需要单点登录的工程的lib目录中,maven工程可以使用如下依赖:

<dependency>

           <groupId>org.jasig.cas.client</groupId>

           <artifactId>cas-client-core</artifactId>

           <version>3.3.3</version>

    </dependency>

然后在web.xml中配置相应的Filter如下:

<!--======================== 单点登录/登出======================== -->

    <!-- 该过滤器用于实现单点登出功能,可选配置。 -->

    <filter>

       <filter-name>CAS Single Sign Out Filter</filter-name>

       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

    </filter>

 

    <!-- 该过滤器负责用户的认证工作,必须启用它 -->

    <filter>

       <filter-name>CAS Authentication Filter</filter-name>

       <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

       <init-param>

           <param-name>casServerLoginUrl</param-name>

           <param-value>https://localhost:8443/cas/login</param-value>

       </init-param>

       <init-param>

           <param-name>serverName</param-name>

           <param-value>http://localhost:8080</param-value>

       </init-param>

    </filter>

 

    <!-- 该过滤器负责对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://localhost:8443/cas</param-value>

       </init-param>

       <init-param>

           <param-name>serverName</param-name>

           <param-value>http://localhost:8080</param-value>

       </init-param>

       <init-param>

           <param-name>redirectAfterValidation</param-name>

           <param-value>true</param-value>

       </init-param>

    </filter>

 

    <!-- 该过滤器负责实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequestgetRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->

    <filter>

       <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>

       <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>

    </filter>

 

    <!-- 该过滤器使得开发者可以通过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 Single Sign Out Filter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

    <filter-mapping>

       <filter-name>CAS Authentication Filter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

    <filter-mapping>

       <filter-name>CAS Validation Filter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

    <filter-mapping>

       <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

    <filter-mapping>

       <filter-name>CAS Assertion Thread Local Filter</filter-name>

       <url-pattern>/*</url-pattern>

    </filter-mapping>

 

    <listener>

    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

    </listener>

<!-- ======================== 单点登录/登出结束 ======================== -->

 

将工程打包之后复制到与cas所在的webapps目录下,启动tomcat,访问项目首页,会自动跳转到cas默认的登录页面。

输入正确的用户名和密码之后,报错:

HTTP Status 500 - javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException: No name matching localhost found

如图:


将以上web.xml中“单点登录/登出”内容里的localhost改成sso.test.com,重启tomcat,访问项目登录页,输入用户名密码点击登录后,报如下错误

HTTP Status 500 - javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException: PKIX path building failed:sun.security.provider.certpath.SunCertPathBuilderException: unable to findvalid certification path to requested target

根本原因是:缺乏有效授权的证书。


这篇文章(http://www.java-samples.com/showtutorial.php?tutorialid=210)有教怎么解决,但是试了不行,继续想办法解决!

 

好了朋友们,在google了大量资料之后,终于想明白一个问题。我是在本机上做练习的,cas和我的工程war包都放在同一个tomcat的webapps目录下,我是直接运行tomcat的startup.bat来运行tomcat的,问题就在这里:

默认情况下,tomcat是使用jdk的,而不是jre,我把证书导入的是jre,这就导致找不到证书啊!

解决方法很简单,在catalina.bat中加入下面一行代码,时tomcat使用jre:

set"JAVA_HOME=D:\Software\Java\jre1.8.0_73"

重启tomcat,运行工程,跳转至登陆页,输入用户名密码,登陆,页面成功跳转。我也是刚接触CAS,希望大家多多互相学习交流,本笔记到此结束。


参考资料:

https://github.com/Jasig/java-cas-client

http://itindex.net/detail/51110-cas-4.0-%E7%99%BB%E5%BD%95

http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html

http://flyingsnail.blog.51cto.com/5341669/1565428

http://sgq0085.iteye.com/blog/2003190

0 0
原创粉丝点击