创建名为 AuthenticationManager 的 bean 时出错

Posted

技术标签:

【中文标题】创建名为 AuthenticationManager 的 bean 时出错【英文标题】:Error creating bean with name AuthenticationManager 【发布时间】:2015-03-18 10:38:09 【问题描述】:

我正在开发一个使用 Spring-Security 的 Spring-MVC 应用程序。在登录应用程序中,我必须使用 2 个登录网址

/j_spring_security_check_for_person 和 /j_spring_security_check_for_group

登录 url 对我实现了 UserDetails 和 userDetailsS​​ervice 的数据库进行检查。为了连接这两个 url 进行登录,我使用的是 springSecurityFilterChain。不幸的是,它不起作用。我从 2 天开始就遇到了这个问题,我可能会犯一些愚蠢的错误。请检查日志和xml,

错误日志:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authenticationManager': Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:239)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1114)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1017)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.security.config.authentication.AuthenticationManagerFactoryBean.getObject(AuthenticationManagerFactoryBean.java:28)
    at org.springframework.security.config.authentication.AuthenticationManagerFactoryBean.getObject(AuthenticationManagerFactoryBean.java:20)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)

安全应用程序上下文.xml

<security:http create-session="ifRequired" use-expressions="true"
               auto-config="true" disable-url-rewriting="true">
    <security:form-login login-page="/" default-target-url="/canvas/list"
               always-use-default-target="false"  authentication-failure-url="/denied.jsp" />
<security:logout logout-success-url="/" delete-cookies="JSESSIONID"
                     invalidate-session="true" logout-url="/j_spring_security_logout"/>
</security:http>



<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
        <security:filter-chain-map path-type="ant">
            <security:filter-chain pattern="/**" filters="authenticationProcessingFilterForPersonal, authenticationProcessingFilterForGroup"/>
        </security:filter-chain-map>
    </bean>


    <bean id="authenticationProcessingFilterForPersonal"
          class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <property name="authenticationManager" ref="authenticationManagerForPersonal"/>
        <property name="filterProcessesUrl" value="/j_spring_security_check_for_person" />
    </bean>

    <bean id="authenticationProcessingFilterForGroup"
          class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <property name="authenticationManager" ref="authenticationManagerForGroup"/>
        <property name="filterProcessesUrl" value="/j_spring_security_check_for_group"/>
    </bean>


    <bean id="authenticationManagerForPersonal" class="org.springframework.security.authentication.ProviderManager">
    <property name="providers">
            <list>
                <bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
                    <property name="userDetailsService">
                        <ref bean="userDetailsService"/>
                    </property>
                    <property name="passwordEncoder" ref="encoder"/>
                </bean>
            </list>
        </property>
    </bean>



    <bean id="authenticationManagerForGroup" class="org.springframework.security.authentication.ProviderManager">
        <property name="providers">
            <list>
                <bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
                    <property name="userDetailsService">
                        <ref bean="groupDetailsService"/>
                    </property>
                    <property name="passwordEncoder" ref="encoder"/>
                </bean>
            </list>
        </property>
    </bean>

    <security:authentication-manager alias="authenticationManager">
        <security:authentication-provider ref="authenticationManagerForPersonal"/>
        <security:authentication-provider ref="authenticationManagerForGroup"/>
    </security:authentication-manager>


    <beans:bean id="encoder"
                class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
        <beans:constructor-arg name="strength" value="11" />
    </beans:bean>

如果我用下面的 sn-p 替换身份验证管理器代码,我不会收到错误,但 2 个登录 url 没有注册:

<security:authentication-manager alias="authenticationManager">
            <security:authentication-provider user-service-ref="userDetailsService">
                <security:password-encoder ref="encoder"/>
            </security:authentication-provider>
            <security:authentication-provider user-service-ref="groupDetailsService">
                <security:password-encoder ref="encoder"/>
            </security:authentication-provider>
        </security:authentication-manager>-->

【问题讨论】:

PS:我有 LoginServiceImpl 有 userDetails 和 GroupLoginServiceImpl 有 groupDetailsS​​ervice。 【参考方案1】:

authenticationManagerForPersonalauthenticationManagerForGroup 是 bean 类型 ProviderManager。这是错误的。您必须将这些 bean 声明为类型 DaoAuthenticationProvider。 请仔细查看我的spring security 配置。

【讨论】:

是的,我已经按照旧帖子中的说明这样做了,这是最新的 pastebin :pastebin.com/GFK3V5Qd【参考方案2】:

如异常消息所示,您的authenticationManagerForGroupauthenticationManagerForPersonal 配置无效。从类型签名和 JavaDoc 中可以发现,ProviderManagerAuthenticationManager 列表作为构造函数参数,但您将 AuthenticationManagers 配置为属性参数。

您应该能够通过将&lt;property name="providers"&gt; 元素替换为&lt;constructor-arg&gt; 来实现此功能。

【讨论】:

这没有帮助。不过谢谢。

以上是关于创建名为 AuthenticationManager 的 bean 时出错的主要内容,如果未能解决你的问题,请参考以下文章

JPA/Hibernate 无法创建名为 Order 的实体

创建名为“springSecurityFilterChain”的 bean 时出错

Spring Boot - “创建名为 'entityManagerFactory' 的 bean 时出错” - 开始

创建名为“requestMappingHandlerAdapter”的 bean 时出错

Spring Boot - “创建名为 'entityManagerFactory' 的 bean 时出错” - 开始

创建名为“activityController”的 bean 时出错