cas 单点登录初试

前几天公司项目说到需要用到单点登录,对于单点登录只是以前听说过,但是觉得挺好奇的,但是没有仔细的看看,既然现在又说到了,那么就去晚上找了一些资料,今天终于把一个小的例子搞定了,虽然大部分是借鉴了别人的经验。下面就做个总结吧,
一、生成证书
首先单点需要用到安全协议,这个我们需要证书,对于实际的应用,我们应该到证书颁发部门购买正说,但是我们只是做个小小测试,就不必如此了,我们的jdk工具可以为我生成这个证书。
生成证书:
keytool -genkey -alias luoding -keyalg RSA -keytore D://keys/luoding.keystore输入命令后会输出如下提示,注意中间红框中的东西,这个为什么要用红色的框框框上,后面再说, 记住后面会说,不要忘记了。

这是你会在 D:/keys目录下看到luoding.keystore这个文件。
导出证书
keytool -export -file D:/keys/luoding.crt -alias luoding -keystore D:/keys/luoding.keystore
这是你会在 D:/keys目录下看到luoding.crt这个文件。
将证书导入jdk,个
人建议先进入到%java_home\jre\lib\security%下证书就到如该目录下的cacerts中,从c盘的根目录进入program files(x86)的命令式cd "program file<x86>" 注意要加引号,还有那个口号是尖括号而不是圆括号。
keytool -import -keystore cacerts -file D:/keys/luo.crt -alias luo
由于我已经进入了cacerts中,所以就不要写该文件的父目录了,还有要注意的是上面的所有的别名最好都写一样的,在最好的命令输入后要输入密码,着这个秘密啊是jdk中的keystore密码,如果你没有修改的话就是changeit,记住不是上面证书的密码,在开始的时候一看到需要输入keystore密码的时候不免想到的是在创建上面证书的密码
在控制台中输入keytool -list -keystore cacerts 如果能在输入出的目录中看到我们证书的名字(我这里请看最里面的红框中的名字)说明我们的证书已经导入到jdk中了,

好了证书已经搞好了。算一大步搞完了,这个比较简单,但是我还是把我在这个过程遇到的问题说一下吧,当然你不一定会遇到。
前面两步已改没什么问题,细心一点就可以了,主要是第三步,由于我们的cacerts文件在windows目录下,这个目录下的文件有些事需要权限,在这一步中遇到常见的问题是 cacerts拒绝访问,这里我遇到这几种原因
1.可能你把文件的路径写错了,你应该检查一下路径是否正确。
2.查看你是否有权限访问这个文件,建议使你当前的用户拥有对这个文件的所有权限。
当然你可能也遇到其他的问题,希望你能分享一下。
二、tomcat配置
在一台机器上启动多个tomcat,我这里的第一个apache-tomcat-7.0.32,第二个apache-tomcat-7.0.32-1,这个似乎有点意思,最初看到一哥们这么写我也觉得好奇,其实也没什么,我们可以回想一下我们以前是怎么配置tomcat,我这里用的是tomcat直接解药就可以用了,首先配置环境变量变量名CATALINA_HOME值是tomcat解压目录D:\apache-tomcat-7.0.32,这样基本就可以了。
在配置一个tomcat,配置一个变量CATALINA_HOME1,变量的值为D:\apache-tomcat-7.0.32-1,这个值具体根据你的tomcat的目录来,配置第三个。。。。。。
自己写吧。我们看一下 startup.bat文件
if "%OS%" == "Windows_NT" setlocal
rem ---------------------------------------------------------------------------
rem Start script for the CATALINA Server
rem
rem $Id: startup.bat 908749 2010-02-10 23:26:42Z markt $
rem ---------------------------------------------------------------------------

rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome

set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"

rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec

rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

:end

发现tomcat的启动依赖CATALINA_HOME环境变量和catalina.bat,catalina.bat内依赖CATALINA_BASE环境变量,这就是为什么我们需要配置这个环境变量了。第一个依赖的是CATALINA_HOME,那么第二个依赖的就是CATALINA_HOME1咯,第三个类似,所以我们就应该吧第二个tomcat中的startup.bat,catalian,bat汇总的所有CATALINA_HOME替换成CATALINA_HOME1,我们修改的启动项,其实我们还可以修改对出项,只要把shutdown.bat中的CATALINA_HOME变换成CATALINA_HOME1就可以了,但是现在还没完,还有重要的东西要做,端口配置,打开第一个tomcat中的server.xml文件找到这个
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改第二个tomcat中server.xml中对应位置的端口,两个tomcat中的端口号一定不要相同,不然会出现端口冲突,当然如果你没有启动也就没有所谓的冲突。
这时我们的机器就可以同时启动两个tomcat了,也许我写的可能会出了一点问题,希望大家能够指出,好让我改正,这里给一个链接,我是参考这篇文章配置,这种配置方式是可行的的。http://blog.163.com/hegonghe@126/blog/static/50004810200871483335100/
前面都是一些准备工作,真正的事开始了。
三、配置cas服务端
下载cas的服务端,当然顺便也把客户端也下载下来吧。下载这两个东东cas-client和cas-server资源。自己到官网上下载吧,我这里就不给地址了,这两个东西在一个下载页面上。
这里我们把第一个tomcat作为cas的服务端,解压我们下载下来的cas-server文件,将modules中的cas-server-webapp-3.4.3.war复制到我们的tomcat中webapps目录下,如果你不觉得这个名字有点长的话你可以不修改,我是把它修改成了cas-server.war。配置我们之前生成的证书,修改tomcat的server.xml文件,修改相应的地方,其中keystoreFile是我的证书的路径,keystorePass是密码,这个名字挺直观的。
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="D:/keys/luoding.keystore" keystorePass="luoding" maxThreads="150" port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS"/>
这是启动我们的tomcat,在浏览器中输入https://127.0.0.1:8443/cas-server/login,注意这个端口和所用的协议,


如果你看到这个界面,那恭喜你,你的服务端配置好。这个很简单,你可以的输入用户名和密码一致就可以登录进入这个界面

四、配置客户端
(以第二个tomcat为例)这里我们就以tomcat目录下的examples项目来测试吧,当然你也可以用别的项目,这个没关系。将这两个包拷贝到项目的lib目录下,commons-logging-1.1.jar,cas-client-core-3.2.1.jar,修改web.xml,在文件中加入如下内容
 <listener>  
    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
  </listener>  

    <filter>  
       <filter-name>CasSingleSignOutFilter</filter-name>  
       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
   </filter>  
 <filter>  
   <filter-name>CasAuthenticationFilter</filter-name>  
   <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>  
    
   <init-param>  
     <param-name>casServerLoginUrl</param-name>  
     <param-value>https://www.luoding.com:8443/cas-server/login</param-value>  
   </init-param>  
   
      <init-param>    
          <param-name>serverName</param-name>    
          <param-value>http://www.luoding.com:8090</param-value>   
      </init-param>  
 </filter>  
 <filter>  
     <filter-name>CasValidationFilter</filter-name>  
     <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>  
     <init-param>  
         <param-name>casServerUrlPrefix</param-name>  
         <param-value>https://www.luoding.com:8443/cas-server</param-value>  
     </init-param>  
    
     <init-param>  
         <param-name>serverName</param-name>  
         <param-value>http://www.luoding.com:8090</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>  
  <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
  <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>  
 </filter>  
 
  <filter>  
        <filter-name>CAS Assertion Thread Local Filter</filter-name>  
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>  
    </filter>  
 <!-- CAS:END -->  
 
<!-- CAS:FILTER -->  
 <filter-mapping>  
    <filter-name>CasSingleSignOutFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
 </filter-mapping>  
 <filter-mapping>  
     <filter-name>CasAuthenticationFilter</filter-name>  
     <url-pattern>/*</url-pattern>  
 </filter-mapping>  
 <filter-mapping>  
     <filter-name>CasValidationFilter</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> 
 <!-- CAS:END -->  
至于每个配置的具体意思我现在也不是很清楚,你可以看看别人的博客或者去看看官网的文档。
这是我的客户端也差不多了,如果你之前还没有退出登录,那么先退出来吧,启动第二个tomcat,apache-tomcat-7.0.32-1,在浏览器中输入http://127.0.0.1:8090/examples会进入我上面的登录页面,输入用户名和密码一致的信息,你可能看到一个这样的错误
Caused by: javax.net.ssl.SSLHandshakeException: 
    java.security.cert.CertificateException: No name matching localhost found
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
    ......
Caused by: java.security.cert.CertificateException: No name matching localhost found
    at sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:210)
    at sun.security.util.HostnameChecker.match(HostnameChecker.java:77)
    ......
这里你是否记得在生成证书的时候没说的东西,这个问题我也不知怎么搞的一直没清楚,后面找到了解决方法,这个问题的原因就是我们的名字和我们的域名一致,也就是我们访问的域名一定是我们生成证书是设定的名字,同样在配置的时候也是使用我在创建证书的时候输入的名字,同时我需要在我们机器上虚拟出这个域名,修改C:\Windows\System32\drivers\etc\hosts文件在文件中最后加入如下信息127.0.0.1  www.luoding.com,这样修改就不会出现这个问题了,对于这个问题你可以再去找找别的信息。好了,
现在我们在浏览器中输入http://www.luoding.com:8090/examples会进入,如果你没有登录的话
登录进入会进入到这个页面

注意url的变化,我们再在浏览器总输入http://www.luoding.com:8090/examples, 这时就会直接进入第二个页面了。

五、数据库配置
上面的只是一个简单的列子,我们只要书用户名和密码一致的信息就可以登录,显然实际应用肯定需要连接数据库,这是我们需要修改cas服务端,也就是cas-server 中的deployerConfigContext.xml,
将这个bean配置注释 <bean  
                class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
同时在相同的位置增加这个bean配置
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
          <property name="dataSource" ref="dataSource"></property>
  <property name="sql" value="select password from users where name = ?"></property>
   <property name="passwordEncoder" ref="defaultEncoder"></property>  
  </bean>
同时配置dataSource和defaultEncoder这两个bean,一个是数据库连接的bean,一个是用于加密的bean,
这是我的配置,自己根据自己的实际需要配置吧

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
                   <property name="driverClassName">
  <value>oracle.jdbc.driver.OracleDriver</value>
  </property>  
  
                   <property name="url">
  <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
  </property>  
  
                   <property name="username">
  <value>scott</value>
  </property>  
  
                   <property name="password">
  <value>orcl</value>
  </property>  
                </bean>  
            <bean id="defaultEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">  
    <constructor-arg index="0">
<value>MD5</value>
</constructor-arg>  
            </bean>  

我这里使用的是MD5加密,这里要注意的是你的数据库中一定要有你在上面配置的表和字段,还有就是向你的数据库中插入数据时候密码应是加密的数据,因为我们制定了加密算法,那么你在数据库中的密码应该是使用该加密算法加密后的密文。
好了,测试的东西和上面一样,这里就不弄了。
这里可能会有个问题,如果你是中文登录可能会出现乱码。我们可以再web.xml文件中加上这个filter来解决。
            <filter>
             <filter-name>encodingFilter</filter-name>
               <filter-class>
               org.springframework.web.filter.CharacterEncodingFilter
             </filter-class>
             <init-param>
             <param-name>encoding</param-name>
             <param-value>utf-8</param-value>
             </init-param>
             </filter>
             <filter-mapping>
             <filter-name>encodingFilter</filter-name>
             <url-pattern>/*</url-pattern>
             </filter-mapping>
这个应该知道什么意思吧,不多说了。
好了,基本说完了,如果有什么错误欢迎大家指出,在下感激不尽。。。。
这里给几个我主要参考的链接吧
解决那个异常的链接http://bluefoot.info/howtos/how-to-avoid-java-security-cert-certificateexception-no-name-matching-localhost-found/
cas配置的
 http://blog.csdn.net/livingtodie/article/details/17374903
http://blog.csdn.net/small_love/article/details/6664831这个链接也提到了两个常见的问题,大家可以看看。
配置多个tomcat的
http://blog.163.com/hegonghe@126/blog/static/50004810200871483335100/

http://www.blogjava.net/Jack2007/archive/2008/08/07/220563.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值