paulwong

          cas單點登錄配置速成


          服務端配置
          cas是個好東西,很靈活很好用,但是配置起來很麻煩,網上資料比較零碎。不弄個三五天根本不知道其中的原理,終于在多天的奮斗中配置成功,現在將配置的一些過程記錄下來供大家參考。


          cas官方網站

          http://www.jasig.org/cas

          下載最新的服務端 CAS Server 3.3.3 Final

          解壓后將modules下面的cas-server-webapp-3.3.3.war部署到web服務器,作為單點登錄的服務器。

           

          登錄的服務器下面很多配置文件,通過配置可以做一些擴展。

          修改點1:驗證方式使用我們自己的用戶表驗證

          cas和當前已有的系統做集成的入口

          1.修改deployerConfigContext.xml文件

          添加數據源配置

          XML/HTML代碼

          <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">   
               
          <property name="driverClassName">   
                    
          <value>com.mysql.jdbc.Driver</value>   
               
          </property>   
               
          <property name="url">   
                    
          <value>jdbc:mysql://192.168.1.100/ires?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true</value>   
               
          </property>   
               
          <property name="username">   
                    
          <value>ires</value>   
               
          </property>   
               
          <property name="password">   
                    
          <value>i709394</value>   
               
          </property>   
          </bean>   

          定義MD5的加密方式

          XML/HTML代碼


          <bean id="passwordEncoder"      
              class
          ="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">          
              
          <constructor-arg value="MD5"/>      
          </bean> 

          配置authenticationManager下面的authenticationHandlers屬性

          XML/HTML代碼


          <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">   
                                
          <property name="dataSource" ref="casDataSource" />   
                                
          <property name="sql" value="select community_password from community_user_info where lower(community_user_info.community_user) = lower(?)" />   
                                  
          <property  name="passwordEncoder"  ref="passwordEncoder"/>   
          </bean>

          修改點2:獲取用戶信息保存,方便各個客戶端可以統一得到用戶信息

          1.定義attributeRepository,通過jdbc查詢用戶的詳細信息,可以把用戶表或用戶的所屬組織機構或角色等查詢出來。

          XML/HTML代碼


          <bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">   
                              
          <constructor-arg index="0" ref="casDataSource" />   
                              
          <constructor-arg index="1" >   
                                  
          <list>   
                                          
          <value>username</value>   
                                          
          <value>username</value>   
                                  
          </list>   
                               
          </constructor-arg>   
                              
          <constructor-arg index="2">   
                                  
          <value>   
                                      select * ,(SELECT orgn_organization.id  from orgn_organization left join orgn_member on orgn_member.orgn_id = orgn_organization.id left join community_user_info on community_user_info.id = orgn_member.user_id where community_user_info.community_user = ?) as orgnId from community_user_info where community_user=?    
                                  
          </value>   
                              
          </constructor-arg>   
                              
          <property name="columnsToAttributes">   
                                  
          <map>   
                                      
          <entry key="id" value="id" />   
                                      
          <entry key="community_user" value="userName" />   
                                      
          <entry key="orgnId" value="orgnId" />   
                                      
          <entry key="is_admin" value="isAdmin" />   
                                          
                                  
          </map>   
                              
          </property>   
                          
          </bean>   

          2.配置authenticationManager中credentialsToPrincipalResolvers屬性

          XML/HTML代碼


          <bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver">   
                              
          <property name="attributeRepository" ref="attributeRepository" />   
          </bean>   

          注意:默認cas登錄服務器沒有把用戶信息傳到客戶端中,所以要修改WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp文件,增加

          XML/HTML代碼


          <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">   
          <cas:attributes>   
          <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">   
                                    
                                                  
          <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>   
             
                                     
          </c:forEach>     
          </cas:attributes>   
          </c:if>   

          修改點3:用數據庫來保存登錄的會話

          這樣服務器在重新啟動的時候不會丟失會話。

          1.修改ticketRegistry.xml文件

          將默認的ticketRegistry改成

          XML/HTML代碼


          <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.JpaTicketRegistry">   
                  
          <constructor-arg index="0" ref="entityManagerFactory" />   
              
          </bean>   
                  
              
          <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">   
                  
          <property name="dataSource" ref="dataSource"/>   
                  
          <property name="jpaVendorAdapter">   
                      
          <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">   
                          
          <property name="generateDdl" value="true"/>   
                          
          <property name="showSql" value="true" />   
                      
          </bean>   
                  
          </property>   
                  
          <property name="jpaProperties">   
                      
          <props>   
                          
          <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>   
                          
          <prop key="hibernate.hbm2ddl.auto">update</prop>   
                      
          </props>   
                  
          </property>   
              
          </bean>   
             
              
          <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"   
                  p:entityManagerFactory-ref
          ="entityManagerFactory" />   
             
              
          <tx:annotation-driven transaction-manager="transactionManager"/>   
             
              
          <bean   
                  
          id="dataSource"   
                  class
          ="org.apache.commons.dbcp.BasicDataSource"   
                  p:driverClassName
          ="com.mysql.jdbc.Driver"   
                  p:url
          ="jdbc:mysql://192.168.1.100:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true"   
                  p:password
          ="709394"   
                  p:username
          ="itravel" />   

          配置完之后還需要一些jar的支持,根據提示那些包缺少到網上找。

           

          修改點4:配置remenber me的功能,可以讓客戶端永久保存session

          1.修改deployerConfigContext.xml文件

          authenticationManager增加authenticationMetaDataPopulators屬性

          XML/HTML代碼


          <property name="authenticationMetaDataPopulators">   
              
          <list>   
                  
          <bean class="org.jasig.cas.authentication.principal.RememberMeAuthenticationMetaDataPopulator" />   
              
          </list>   
          </property>   

          2.修改cas-servlet.xml

          修改authenticationViaFormAction配置變成

          XML/HTML代碼

          <bean id="authenticationViaFormAction" class="org.jasig.cas.web.flow.AuthenticationViaFormAction"   
              p:centralAuthenticationService-ref
          ="centralAuthenticationService"   
              p:formObjectClass
          ="org.jasig.cas.authentication.principal.RememberMeUsernamePasswordCredentials"   
              p:formObjectName
          ="credentials"   
              p:validator-ref
          ="UsernamePasswordCredentialsValidator"   
              p:warnCookieGenerator-ref
          ="warnCookieGenerator" />   

          增加UsernamePasswordCredentialsValidator

          XML/HTML代碼

          <bean id="UsernamePasswordCredentialsValidator" class="org.jasig.cas.validation.UsernamePasswordCredentialsValidator" />   

          修改ticketExpirationPolicies.xml,grantingTicketExpirationPolicy配置如下,注意時間要加大,不然session很容易過期,達不到remember me的效果。

          XML/HTML代碼

          <bean id="grantingTicketExpirationPolicy" class="org.jasig.cas.ticket.support.RememberMeDelegatingExpirationPolicy">   
             
          <property name="sessionExpirationPolicy">   
              
          <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">   
                     
          <constructor-arg index="0" value="2592000000" />   
              
          </bean>   
             
          </property>   
             
          <property name="rememberMeExpirationPolicy">   
              
          <bean class="org.jasig.cas.ticket.support.TimeoutExpirationPolicy">   
                     
          <constructor-arg index="0" value="2592000000" />   
              
          </bean>   
             
          </property>   
          </bean>   

          修改點5:取消https驗證

          在網絡安全性較好,對系統安全沒有那么高的情況下可以取消https驗證,使系統更加容易部署。

          1.修改ticketGrantingTicketCookieGenerator.xml

          XML/HTML代碼


          <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"   
                  p:cookieSecure
          ="false"   
                  p:cookieMaxAge
          ="-1"   
                  p:cookieName
          ="CASTGC"   
                  p:cookiePath
          ="/cas" />   

          p:cookieSecure改成false,客戶端web.xml中單獨服務器的鏈接改成http

           

           

           

          使用https協議的配置

          1.證書生成和導入

          下面是一個生成證書和導入證書的bat腳本,如果web應用和單獨登錄服務器部署在同一臺機可以一起執行

          C++代碼


          @echo off    
          if "%JAVA_HOME%" == "" goto error    
          @echo on    
             
          @echo off    
          cls     
          rem please 
          set the env JAVA_HOME before run this bat file     
          rem delete alia tomcat 
          if it is existed     
          keytool 
          -delete -alias tomcatsso -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit     
          keytool 
          -delete -alias tomcatsso -storepass changeit     
          REM (注釋: 清除系統中可能存在的名字為tomcatsso 的同名證書)    
          rem list all alias 
          in the cacerts     
          keytool 
          -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit     
          REM (注釋: 列出系統證書倉庫中存在證書名稱列表)    
          rem generator a key     
          keytool 
          -genkey -keyalg RSA -alias tomcatsso -dname "cn=localhost" -storepass changeit     
          REM (注釋:指定使用RSA算法,生成別名為tomcatsso的證書,存貯口令為changeit,證書的DN為
          "cn=linly" ,這個DN必須同當前主機完整名稱一致哦,切記!!!)    
          rem export the key     
          keytool 
          -export -alias tomcatsso -file "%java_home%/jre/lib/security/tomcatsso.crt" -storepass changeit     
          REM (注釋: 從keystore中導出別名為tomcatsso的證書,生成文件tomcatsso.crt)    
          rem import into trust cacerts     
          keytool 
          -import -alias tomcatsso -file "%java_home%/jre/lib/security/tomcatsso.crt" -keystore "%java_home%/jre/lib/security/cacerts" -storepass changeit     
          REM (注釋:將tomcatsso.crt導入jre的可信任證書倉庫。注意,安裝JDK是有兩個jre目錄,一個在jdk底下,一個是獨立的jre,這里的目錄必須同Tomcat使用的jre目錄一致,否則后面Tomcat的HTTPS通訊就找不到證書了)    
          rem list all alias 
          in the cacerts     
          keytool 
          -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit    
          pause    
             
          :error    
          echo 請先設置JAVA_HOME環境變量    
          :end   

          3.將.keystore文件拷貝到tomcat的conf目錄下面,注意.keystore會在證書生成的時候生成到系統的用戶文件夾中,如windows會生產到C:\Documents and Settings\[yourusername]\下面

          2.配置tomcat,把https協議的8443端口打開,指定證書的位置。

          XML/HTML代碼


          <Connector port="8443" maxHttpHeaderSize="8192"   
                        maxThreads
          ="150" minSpareThreads="25" maxSpareThreads="75"   
                        enableLookups
          ="false" disableUploadTimeout="true"   
                        acceptCount
          ="100" scheme="https" secure="true"   
                        clientAuth
          ="false" sslProtocol="TLS"     
            keystoreFile
          ="conf/.keystore"  keystorePass="changeit"   truststoreFile="C:\Program Files\Java\jdk1.5.0_07\jre\lib\security\cacerts"/>     

          客戶端配置

          cas官方網站上面的客戶端下載地址比較隱秘,沒有完全公開,具體地址為

          http://www.ja-sig.org/downloads/cas-clients/

          下載最新的cas-client-3.1.6-release.zip

          1.解壓后把modules下面的包放到我們的web應用中

          2.配置web.xml,注意encodingFilter要提前配置,不然會出現數據插入數據庫的時候有亂碼。

          serverName是我們web應用的地址和端口

          XML/HTML代碼


          <context-param>   
                  
          <param-name>serverName</param-name>   
             
             
                  
          <param-value>192.168.1.145:81</param-value>   
             
              
          </context-param>   
                  
                  
              
          <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>   
                  
          <init-param>   
                      
          <param-name>forceEncoding</param-name>   
                      
          <param-value>true</param-value>   
                  
          </init-param>   
              
          </filter>   
                  
                  
                  
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.htm</url-pattern>   
              
          </filter-mapping>   
             
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.ftl</url-pattern>   
              
          </filter-mapping>   
             
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.xhtml</url-pattern>   
              
          </filter-mapping>   
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.html</url-pattern>   
              
          </filter-mapping>   
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.shtml</url-pattern>   
              
          </filter-mapping>   
             
             
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.jsp</url-pattern>   
              
          </filter-mapping>   
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.do</url-pattern>   
              
          </filter-mapping>   
              
          <filter-mapping>   
                  
          <filter-name>encodingFilter</filter-name>   
                  
          <url-pattern>*.vm</url-pattern>   
              
          </filter-mapping>   
                  
                  
                  
                  
                  
              
          <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>   
              
          <listener>   
                  
          <listener-class>   
                      org.jasig.cas.client.session.SingleSignOutHttpSessionListener    
                  
          </listener-class>   
              
          </listener>   
              
          <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>http://192.168.1.100/cas/login</param-value>   
                  
          </init-param>   
              
          </filter>   
              
          <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>http://192.168.1.100/cas</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>   
              
          <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>   

          3.導入證書,如果不用https的話,這步可以跳過,把tomcatsso.crt證書拷貝到c盤下面,在jdk的bin目錄下面運行下面的語句。

           

          JavaScript代碼


          rem (注釋: 清除系統中可能存在的名字為tomcatsso 的同名證書)    
          keytool 
          -delete -alias tomcatsso -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -storepass changeit     
          keytool 
          -delete -alias tomcatsso -storepass changeit     
             
          rem 在客戶端的 JVM 里導入信任的 SERVER 的證書 ( 根據情況有可能需要管理員權限 )     
          keytool 
          -import -alias tomcatsso -file "c:/tomcatsso.crt" -keystore "%java_home%/jre/lib/security/cacerts" -storepass changeit    

           客戶端獲取登錄用戶名和用戶信息實例

          Java代碼

          HttpServletRequest request = ServletActionContext.getRequest();    
          AttributePrincipal principal 
          = (AttributePrincipal)request.getUserPrincipal();    
          String username 
          = principal.getName();    
          Long orgnId 
          = Long.parseLong(principal.getAttributes().get("orgnId").toString());   

          posted on 2009-10-20 23:58 paulwong 閱讀(4592) 評論(6)  編輯  收藏 所屬分類: J2EE

          Feedback

          # re: cas單點登錄配置速成 2009-10-22 16:23 849536401

          樓主寫的非常詳細,這是到現在為止我看到最全的cas配置文檔了。
          正需要這些信息呢,謝謝了!
          :)  回復  更多評論   

          # re: cas單點登錄配置速成 2009-10-30 15:00 游客

          學習  回復  更多評論   

          # re: cas單點登錄配置速成 2009-12-04 23:14 unique_zxs

          寫的非常棒,找了半個月你的是最詳細的。非常實用。  回復  更多評論   

          # re: cas單點登錄配置速成 2010-03-25 09:00 groush

          <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">
          <cas:attributes>
          <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">

          <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>


          </c:forEach>
          </cas:attributes>
          </c:if>
          這個文件拷進去,是錯的,但是我修改后,用戶信息也出不來,郁悶ing  回復  更多評論   

          # re: cas單點登錄配置速成 2010-05-12 15:33 郭凡

          到底怎么樣實現只登錄一次啊。。。還是沒看到具體的最后得到用戶信息這個東西有撒子用處?  回復  更多評論   

          # re: cas單點登錄配置速成 2010-05-12 15:41 郭凡

          哥哥,,522196314 能加我嗎。。。崇拜你  回復  更多評論   


          主站蜘蛛池模板: 广德县| 南雄市| 汉源县| 辽中县| 临漳县| 昭苏县| 恩施市| 兰州市| 项城市| 巩留县| 甘德县| 大港区| 铜山县| 洛阳市| 利津县| 兖州市| 九龙城区| 资溪县| 义马市| 清河县| 宝坻区| 大理市| 湘潭县| 沂源县| 策勒县| 昭平县| 建平县| 攀枝花市| 开封市| 手游| 甘泉县| 社会| 建瓯市| 明星| 龙江县| 从化市| 龙陵县| 屯门区| 吴桥县| 沧源| 磐石市|