【问题标题】:CAS SSO 4.2.0 Database authentication setup errorCAS SSO 4.2.0 数据库身份验证设置错误
【发布时间】:2016-04-17 12:16:12
【问题描述】:

我尝试使用战争覆盖方法实现 cas 数据库身份验证。但我最终得到了错误,

ERROR [org.springframework.web.context.ContextLoader] - <Context initialization failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'queryAndEncodeDatabaseAuthenticationHandler' defined in URL [jar:file:/Users/prabath/Downloads/apache-tomcat-8.0.33/webapps/cas/WEB-INF/lib/cas-server-support-jdbc-4.2.0.jar!/org/jasig/cas/adaptors/jdbc/QueryAndEncodeDatabaseAuthenticationHandler.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.sql.DataSource]: : No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=queryEncodeDatabaseDataSource)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=queryEncodeDatabaseDataSource)}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    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:4811)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    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:940)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816)
    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)

我首先尝试设置基本的 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>com.headstart.cas</groupId>
    <artifactId>cas</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <warName>cas</warName>
                </configuration>
            </plugin>
        </plugins>
    </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-generic</artifactId>
            <version>${cas.version}</version>
            <type>jar</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.jasig.cas</groupId>
            <artifactId>cas-server-support-jdbc</artifactId>
            <version>${cas.version}</version>
            <type>jar</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>
    <properties>
        <cas.version>4.2.0</cas.version>
    </properties>
    <repositories>
        <repository>
            <id>ja-sig</id>
            <url>http://oss.sonatype.org/content/repositories/releases/ </url>
        </repository>
    </repositories>
</project>

而 developerConfigContext.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">
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://127.0.0.1:3306/cas" p:username="root" p:password="adrTHbnm" />
    <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="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="searchModeSearchDatabaseAuthenticationHandler" alias="primaryAuthenticationHandler" />
    <alias name="dataSource" alias="searchModeDatabaseDataSource" />
</beans>

【问题讨论】:

    标签: java spring maven cas


    【解决方案1】:

    如果我使用“QueryAndEncodeDatabaseAuthenticationHandler”,我知道我应该使用“queryEncodeDatabaseDataSource”。但这里我使用的是“SearchModeSearchDatabaseAuthenticationHandler”。

    我能够通过使用 QueryAndEncodeDatabaseAuthenticationHandler 解决此问题。或者只是将“”添加到配置中。看来不管我们定义什么认证handler,cas都会先自动初始化QueryAndEncodeDatabaseAuthenticationHandler。

    【讨论】:

      【解决方案2】:

      这是我的 deployerConfigContext.xml

      <?xml version="1.0" encoding="UTF-8"?>
      
      <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">
      
      
      
      <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource"
        p:driverClassName="com.mysql.jdbc.Driver"
        p:url="jdbc:mysql://127.0.0.1:3306/cas"
        p:username="root"
        p:password="*****" />
      
      <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="queryAndEncodeDatabaseAuthenticationHandler" alias="primaryAuthenticationHandler" />
      <alias name="dataSource" alias="queryEncodeDatabaseDataSource" />
      

      【讨论】:

        【解决方案3】:

        在这里跟进,我认为这个问题实际上是一个在 4.2.2 中修复的错误。

        【讨论】:

          【解决方案4】:

          只需在“deployerConfigContext.xml”中添加一行代码:

          &lt;alias name="dataSource" alias="queryEncodeDatabaseDataSource"/&gt;

          【讨论】:

            【解决方案5】:

            您没有关注文档。正如错误告诉您的那样,别名必须是 queryEncodeDatabaseDataSource。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-08-07
              • 2013-09-22
              • 1970-01-01
              • 2013-07-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多