2016-09-15 140 views
0

当我开始使用CAS时,遇到了一个问题,导致我的CAS服务器出现白屏。我不知道为什么所以我尝试了另一个版本,并使用4.0.0而不是4.2.x.突然它工作。但是我决定我想要最新版本的CAS并试图升级我的项目。当然,我仍然有同样的问题。当我打开CAS服务器我得到下面的异常:将CAS 4.0.0升级到4.2.x

2016-09-15 09:37:31,563 ERROR [org.springframework.web.context.ContextLoader] - <Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'centralAuthenticationService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ticketRegistry' is defined 
     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:311) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:838) 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) 
     at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) 
     at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) 
     at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 
     at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4812) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 
     at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 
     at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 
     at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945) 
     at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1795) 
     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
     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) 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ticketRegistry' is defined 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:698) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1175) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284) 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 
     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:512) 
     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:486) 
     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:615) 
     at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:169) 
     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
     at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:308) 
     ... 26 more 
> 

于是我查了一下是我war文件我的CAS服务器和我supprise我发现了deployerConfigContext.xml文件不是我所使用的文件。

这是我deployerConfigContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
| deployerConfigContext.xml centralizes into one file some of the declarative configuration that 
| all CAS deployers will need to modify. 
| 
| This file declares some of the Spring-managed JavaBeans that make up a CAS deployment. 
| The beans declared in this file are instantiated at context initialization time by the Spring 
| ContextLoaderListener declared in web.xml. It finds this file because this 
| file is among those declared in the context parameter "contextConfigLocation". 
| 
| By far the most common change you will need to make in this file is to change the last bean 
| declaration to replace the default authentication handler with 
| one implementing your approach for authenticating usernames and passwords. 
+--> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:c="http://www.springframework.org/schema/c" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:sec="http://www.springframework.org/schema/security" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <util:map id="authenticationHandlersResolvers"> 
     <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" /> 
     <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> 
    </util:map> 

    <util:list id="authenticationMetadataPopulators"> 
     <ref bean="successfulHandlerMetaDataPopulator" /> 
     <ref bean="rememberMeAuthenticationMetaDataPopulator" /> 
    </util:list> 

    <bean id="attributeRepository" class="org.jasig.services.persondir.support.NamedStubPersonAttributeDao" 
      p:backingMap-ref="attrRepoBackingMap" /> 

    <alias name="acceptUsersAuthenticationHandler" alias="primaryAuthenticationHandler" /> 
    <alias name="personDirectoryPrincipalResolver" alias="primaryPrincipalResolver" /> 

    <util:map id="attrRepoBackingMap"> 
     <entry key="uid" value="uid" /> 
     <entry key="eduPersonAffiliation" value="eduPersonAffiliation" /> 
     <entry key="groupMembership" value="groupMembership" /> 
     <entry> 
      <key><value>memberOf</value></key> 
      <list> 
       <value>faculty</value> 
       <value>staff</value> 
       <value>org</value> 
      </list> 
     </entry> 
    </util:map> 

    <alias name="serviceThemeResolver" alias="themeResolver" /> 

    <alias name="jsonServiceRegistryDao" alias="serviceRegistryDao" /> 

    <alias name="defaultTicketRegistry" alias="ticketRegistry" /> 

    <alias name="ticketGrantingTicketExpirationPolicy" alias="grantingTicketExpirationPolicy" /> 
    <alias name="multiTimeUseOrTimeoutExpirationPolicy" alias="serviceTicketExpirationPolicy" /> 

    <alias name="anyAuthenticationPolicy" alias="authenticationPolicy" /> 
    <alias name="acceptAnyAuthenticationPolicyFactory" alias="authenticationPolicyFactory" /> 

    <bean id="auditTrailManager" 
      class="org.jasig.inspektr.audit.support.Slf4jLoggingAuditTrailManager" 
      p:entrySeparator="${cas.audit.singleline.separator:|}" 
      p:useSingleLine="${cas.audit.singleline:false}"/> 

    <alias name="neverThrottle" alias="authenticationThrottle" /> 

    <util:list id="monitorsList"> 
     <ref bean="memoryMonitor" /> 
     <ref bean="sessionMonitor" /> 
    </util:list> 

    <alias name="defaultPrincipalFactory" alias="principalFactory" /> 
    <alias name="defaultAuthenticationTransactionManager" alias="authenticationTransactionManager" /> 
    <alias name="defaultPrincipalElectionStrategy" alias="principalElectionStrategy" /> 
    <alias name="tgcCipherExecutor" alias="defaultCookieCipherExecutor" /> 

    <bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource"> 
     <property name="pooled" value="true"/> 
      <property name="urls"> 
       <list> 
        <value>ldap://localhost:389</value> 
       </list> 
      </property> 
      <property name="userDn" value="uid=admin,ou=system"/> 
      <property name="password" value="secret"/> 
      <property name="baseEnvironmentProperties"> 
      <map> 
       <entry key="java.naming.security.authentication" value="simple" /> 
      </map> 
     </property> 
    </bean> 
    <bean class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler" > 
     <property name="filter" value="uid=%u,ou=system" /> 
     <property name="contextSource" ref="contextSource" /> 
    </bean> 

    <bean class="org.jasig.cas.services.RegisteredServiceImpl"> 
      <property name="id" value="0" /> 
      <property name="name" value="HTTP" /> 
      <property name="description" value="Only Allows HTTP Urls" /> 
      <property name="serviceId" value="https://**" /> 
      <property name="evaluationOrder" value="10000001" /> 
      <property name="enabled" value="true" /> 
      <property name="allowedToProxy" value="true" /> 
      <property name="ssoEnabled" value="true" /> 
</bean> 

</beans> 

这是deployerConfigContext.xml那是在我的war文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
| deployerConfigContext.xml centralizes into one file some of the declarative configuration that 
| all CAS deployers will need to modify. 
| 
| This file declares some of the Spring-managed JavaBeans that make up a CAS deployment. 
| The beans declared in this file are instantiated at context initialization time by the Spring 
| ContextLoaderListener declared in web.xml. It finds this file because this 
| file is among those declared in the context parameter "contextConfigLocation". 
| 
| By far the most common change you will need to make in this file is to change the last bean 
| declaration to replace the default authentication handler with 
| one implementing your approach for authenticating usernames and passwords. 
+--> 

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:c="http://www.springframework.org/schema/c" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:sec="http://www.springframework.org/schema/security" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager"> 
     <constructor-arg> 
      <map> 
       <entry key-ref="ldapAuthenticationHandler" value="#{null}"/> 
       <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" /> 
      </map> 
     </constructor-arg> 
     <property name="authenticationPolicy"> 
      <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" /> 
     </property> 
    </bean> 

    <!-- Required for proxy ticket mechanism. --> 
    <bean id="proxyAuthenticationHandler" 
      class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" 
      p:httpClient-ref="httpClient" /> 

    <!-- Required for proxy ticket mechanism --> 
    <bean id="proxyPrincipalResolver" 
      class="org.jasig.cas.authentication.principal.BasicPrincipalResolver" /> 

    <bean id="ldapAuthenticationHandler" 
      class="org.jasig.cas.authentication.LdapAuthenticationHandler" 
      p:principalIdAttribute="cn" 
      c:authenticator-ref="ldapAuthenticator"> 
     <property name="principalAttributeMap"> 
     <map> 
      <entry key="member" value="member" /> 
      <entry key="mail" value="mail" /> 
      <entry key="displayName" value="displayName" /> 
     </map> 
     </property> 
    </bean> 

    <bean id="ldapAuthenticator" class="org.ldaptive.auth.Authenticator" 
      c:resolver-ref="dnResolver" 
     c:handler-ref="ldapAuthHandler" /> 

    <bean id="dnResolver" 
      class="org.ldaptive.auth.FormatDnResolver" 
      c:format="cn=%s,${ldap.baseDn}" /> 

    <bean id="ldapAuthHandler" class="org.ldaptive.auth.PooledBindAuthenticationHandler" 
      p:connectionFactory-ref="pooledLdapConnectionFactory" /> 

    <bean id="pooledLdapConnectionFactory" 
      class="org.ldaptive.pool.PooledConnectionFactory" 
      p:connectionPool-ref="connectionPool" /> 

    <bean id="connectionPool" 
      class="org.ldaptive.pool.BlockingConnectionPool" 
      init-method="initialize" 
      p:poolConfig-ref="ldapPoolConfig" 
      p:blockWaitTime="${ldap.pool.blockWaitTime}" 
      p:validator-ref="searchValidator" 
      p:pruneStrategy-ref="pruneStrategy" 
      p:connectionFactory-ref="connectionFactory" /> 

    <bean id="ldapPoolConfig" class="org.ldaptive.pool.PoolConfig" 
      p:minPoolSize="${ldap.pool.minSize}" 
      p:maxPoolSize="${ldap.pool.maxSize}" 
      p:validateOnCheckOut="${ldap.pool.validateOnCheckout}" 
      p:validatePeriodically="${ldap.pool.validatePeriodically}" 
      p:validatePeriod="${ldap.pool.validatePeriod}" /> 

    <bean id="connectionFactory" class="org.ldaptive.DefaultConnectionFactory" 
      p:connectionConfig-ref="connectionConfig" /> 

    <bean id="connectionConfig" class="org.ldaptive.ConnectionConfig" 
      p:ldapUrl="${ldap.url}" 
      p:connectTimeout="${ldap.connectTimeout}" 
      p:useStartTLS="${ldap.useStartTLS}" /> 

    <!-- needs review, tired of fighting it 
     p:sslConfig-ref="sslConfig" /> 
    <bean id="sslConfig" class="org.ldaptive.ssl.SslConfig"> 
     <property name="credentialConfig"> 
     <bean class="org.ldaptive.ssl.X509CredentialConfig" 
       p:trustCertificates="${ldap.trustedCert}" /> 
     </property> 
    </bean> 
    --> 

    <bean id="pruneStrategy" class="org.ldaptive.pool.IdlePruneStrategy" 
      p:prunePeriod="${ldap.pool.prunePeriod}" 
      p:idleTime="${ldap.pool.idleTime}" /> 

    <bean id="searchValidator" class="org.ldaptive.pool.SearchValidator" /> 

    <!-- 
    Sample, in-memory data store for the ServiceRegistry. A real implementation 
    would probably want to replace this with the JPA-backed ServiceRegistry DAO 
    The name of this bean should remain "serviceRegistryDao". 
    +--> 
    <bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl" 
      p:registeredServices-ref="registeredServicesList" /> 

    <util:list id="registeredServicesList"> 
     <bean class="org.jasig.cas.services.RegexRegisteredService" 
       p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols" 
       p:serviceId="^(https?|imaps?)://.*" p:evaluationOrder="10000001" /> 
    </util:list> 

    <bean id="auditTrailManager" class="com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager" /> 

    <bean id="healthCheckMonitor" class="org.jasig.cas.monitor.HealthCheckMonitor" p:monitors-ref="monitorsList" /> 

    <util:list id="monitorsList"> 
     <bean class="org.jasig.cas.monitor.MemoryMonitor" p:freeMemoryWarnThreshold="10" /> 
     <!-- 
     NOTE 
     The following ticket registries support SessionMonitor: 
      * DefaultTicketRegistry 
      * JpaTicketRegistry 
     Remove this monitor if you use an unsupported registry. 
     --> 
     <bean class="org.jasig.cas.monitor.SessionMonitor" 
      p:ticketRegistry-ref="ticketRegistry" 
      p:serviceTicketCountWarnThreshold="5000" 
      p:sessionCountWarnThreshold="100000" /> 
    </util:list> 
</beans> 

我有一种感觉,这个问题可能是,我得到一个“错误“deployerConfigContext.xml文件,这就是为什么他无法找到该bean。

,我改变的唯一事情是,我改变的是CAS在pom.xml文件版本:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>org.jasig.cas</groupId> 
    <artifactId>cas-overlay</artifactId> 
    <packaging>war</packaging> 
    <version>1.0</version> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
        <warName>cas</warName> 
        <overlays> 
         <overlay> 
          <groupId>org.jasig.cas</groupId> 
          <artifactId>cas-server-webapp</artifactId> 
          <excludes> 
           <exclude>WEB-INF/cas.properties</exclude> 
          </excludes> 
         </overlay> 
        </overlays> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.1</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
     <finalName>github-cas</finalName> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.jasig.cas</groupId> 
      <artifactId>cas-server-webapp</artifactId> 
      <version>${cas.version}</version> 
      <type>war</type> 
      <scope>runtime</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.jasig.cas</groupId> 
      <artifactId>cas-server-support-ldap</artifactId> 
      <version>${cas.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>${servlet.version}</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 

    <properties> 
     <cas.version>4.2.0</cas.version> 
     <servlet.version>2.5</servlet.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
</project> 

回答

0

原来,deployerConfigContext.xml是走错了路内。