4

amazon aws内のクラスタ環境で動作するようにCAS(4.1)を設定しようとしています。 私はクラスタリングのためにTomcat 7を設定しましたが、awsではマルチキャストの自動検出は使用できませんので、tomcatコンテキストでデータベースセッションの複製を設定しました。 セッションレプリケーションは、(同じクラスタ内の他のアプリケーションがそれを正しく使用しています)良い動作しているようだ:CAS 4 AWSでのクラスタリング:チケットが認識されない

<Context path="cas" crossContext="true"> 
     <Manager className="org.apache.catalina.session.PersistentManager" distributable="true" processExpiresFrequency="3" maxIdleBackup="1" > 
       <Store className="org.apache.catalina.session.JDBCStore" 
       driverName="org.postgresql.Driver" 
       connectionURL="jdbc:postgresql://*****:5432/****" 
       connectionName="*****" connectionPassword="*****" 
       sessionAppCol="app_name" sessionDataCol="session_data" sessionIdCol="session_id" 
       sessionLastAccessedCol="last_access" sessionMaxInactiveCol="max_inactive" 
       sessionTable="persistent_sessions" sessionValidCol="valid_session" /> 
     </Manager> 
</Context> 

次のCASコンフィギュレーションガイドの説明のように、私は、CAS設定にjpaTicketRegistryとuniqueGeneratorsを構成した:

<bean id="cleanerLock" 
    class="org.jasig.cas.ticket.registry.support.JpaLockingStrategy" 
    p:uniqueId="${host.name}" p:applicationId="cas-ticket-registry-cleaner" /> 

<bean id="jobDetailTicketRegistryCleaner" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" 
    p:targetObject-ref="ticketRegistryCleaner" p:targetMethod="clean" /> 

<bean id="triggerJobDetailTicketRegistryCleaner" 
    class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean" 
    p:jobDetail-ref="jobDetailTicketRegistryCleaner" p:startDelay="20000" 
    p:repeatInterval="5000000" /> 

<bean id="ticketGrantingTicketUniqueIdGenerator" class="org.jasig.cas.util.DefaultUniqueTicketIdGenerator" 
     c:maxLength="50" c:suffix="${host.name}" /> 

    <bean id="serviceTicketUniqueIdGenerator" class="org.jasig.cas.util.DefaultUniqueTicketIdGenerator" 
     c:maxLength="20" c:suffix="${host.name}" /> 

    <bean id="loginTicketUniqueIdGenerator" class="org.jasig.cas.util.DefaultUniqueTicketIdGenerator" 
     c:maxLength="30" c:suffix="${host.name}" /> 

    <bean id="proxy20TicketUniqueIdGenerator" class="org.jasig.cas.util.DefaultUniqueTicketIdGenerator" 
     c:maxLength="20" c:suffix="${host.name}" /> 

    <util:map id="uniqueIdGeneratorsMap"> 
     <entry 
      key="org.jasig.cas.authentication.principal.SimpleWebApplicationServiceImpl" 
      value-ref="serviceTicketUniqueIdGenerator" /> 
    </util:map> 

<bean id="ticketGrantingTicketCookieGenerator" 
     class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" 
     c:casCookieValueManager-ref="cookieValueManager" 
     p:cookieSecure="true" 
     p:cookieMaxAge="-1" 
     p:cookieName="TGC" 
     p:cookiePath="/cas" /> 

    <bean id="cookieCipherExecutor" class="org.jasig.cas.util.DefaultCipherExecutor" 
     c:secretKeyEncryption="${tgc.encryption.key}" 
     c:secretKeySigning="${tgc.signing.key}" /> 

    <bean id="cookieValueManager" class="org.jasig.cas.web.support.DefaultCasCookieValueManager" 
      c:cipherExecutor-ref="cookieCipherExecutor" /> 

は今、アプリケーションが起動され、単一ノード上で正常に動作しているが、私は2番目のノードを起動したときに、時間のログインチケットのほとんどが認識されていない、これはに失敗するクライアントアプリケーションをリードログイン:

17:52:48,986 ERROR [http-bio-8443-exec-11][CASFilter:83] org.jasig.cas.client.validation.TicketValidationException: _   Ticket 'ST-1-uFUEA1PDhSv4GPQ61E1T-customers01.dwssystems.com' not recognized_  [Sanitized] 
org.jasig.cas.client.validation.TicketValidationException: _   Ticket 'ST-1-uFUEA1PDhSv4GPQ61E1T-customers01.mycompany.com' not recognized_  [Sanitized] 
    at org.jasig.cas.client.validation.Cas20ServiceTicketValidator.parseResponseFromServer(Cas20ServiceTicketValidator.java:73) 
    at org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:188) 
    at com.liferay.portal.servlet.filters.sso.cas.CASFilter.processFilter(CASFilter.java:194) 
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:59) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:204) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:109) 
    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:169) 
    at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:88) 
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:59) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:204) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:109) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:185) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96) 
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738) 
    at com.liferay.portal.servlet.filters.urlrewrite.UrlRewriteFilter.processFilter(UrlRewriteFilter.java:57) 
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:59) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:204) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:109) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:165) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:165) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:185) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96) 
    at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:119) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(JvmRouteBinderValve.java:219) 
    at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:335) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

私は2つのノードに異なるホスト名を使用しています(casリファレンスに記載されています)。チケットはデータベーステーブルの中に登録されていますが、2番目のノードがそれを確認できないようです。

問題がセッション複製、ノード間の自動検出の欠如、または一部の構成に関するものかどうかはわかりません。

+0

JPATicketRegistryを実際に設定したように見えません。少なくともあなたのメッセージにその設定を表示していませんでした。私の推測では、CASサーバーは引き続きデフォルトのチケットレジストリを使用しています。 –

+0

チケットのあるテーブルにデータが入力されています。設定ファイルはすべて整っていますが、jpaTicketRegistryが使用されているかどうかはどうすれば確認できますか? –

+0

両方のノードまたは1つのノードから追加されていますか? –

答えて

0

私は以下のように変更して、それを修正するために管理してきました: - 静的メンバーシップを持つ構成されたTomcatのクラスタ(私が原因AWSの制限のためにマルチキャストを使用することはできませんので) - 更新2つのBeanの設定:

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" 
      p:cookieDomain="mycompany.com" // ---->> added this 
      p:cookieSecure="true" 
      p:cookieMaxAge="-1" 
      p:cookieName="CASPRIVACY" 
      p:cookiePath="/cas"/> 

<bean id="ticketGrantingTicketCookieGenerator" 
      class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" 
      c:casCookieValueManager-ref="cookieValueManager" 
      p:cookieDomain="mycompany.com" // --->> added this 
      p:cookieSecure="true" 
      p:cookieMaxAge="-1" 
      p:cookieName="TGC" 
      p:cookiePath="/cas" /> 
関連する問題