Spring Security CustomUserDetailsS​​ervice - NoSuchBeanDefinitionException

时间:2016-02-14 16:18:00

标签: xml spring spring-mvc spring-security

我正在尝试为Spring安全性实现CustomUserDetailsS​​ervice。我在一个不同的项目中成功地做了同样的事情,但现在我要么得到org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'customUserDetailsService' is defined。 或springSecurityFilterChain的实例化异常。 我的结论是,我的配置出现了严重错误。

所以这是我的文件:

的web.xml

     <web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">



<display-name>MVC</display-name>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
            /WEB-INF/security.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping> 

当在init-param标记中包含它而不是security.xml时,我得到springSecurityFilterChain的InstantiationException(项目开始)

  <!--   <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
               /WEB-INF/security.xml         
            </param-value>
        </context-param>
 -->  

web.xml的第2部分

   <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <listener>
            <listener-class>
                org.springframework.web.context.request.RequestContextListener
            </listener-class>
        </listener>
   <filter>
                <filter-name>springSecurityFilterChain</filter-name>
                <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
            </filter>

            <filter-mapping>
                <filter-name>springSecurityFilterChain</filter-name>
                <url-pattern>/*</url-pattern>
            </filter-mapping>


            <!-- Map these files with JSF -->
        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>*.jsf</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>*.faces</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>Faces Servlet</servlet-name>
            <url-pattern>*.xhtml</url-pattern>
        </servlet-mapping>

               <!-- Welcome page -->                    
        <welcome-file-list>
            <welcome-file>faces/index.xhtml</welcome-file>
        </welcome-file-list>

        <!-- JSF mapping -->
        <servlet>
            <servlet-name>Faces Servlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>



    </web-app>

的applicationContext.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:tx="http://www.springframework.org/schema/tx"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:sec="http://www.springframework.org/schema/security"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/data/jpa 
            http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
            http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- Componenten Scannen -->
    <context:component-scan base-package="QUEST.l01.Controller" />
    <context:component-scan base-package="QUEST.l01.Model" />
     <context:component-scan base-package="QUEST.l01.Services" />


     <context:annotation-config/>
    <context:spring-configured/>


    <mvc:resources mapping="/resources/**" location="/resources/" />
    <mvc:annotation-driven />


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/quest_l01" />
        <property name="username" value="l01" />
        <property name="password" value="SqXrCty9xUR47PwS" />
    </bean>


    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="QUEST.l01.Model" />   
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="hibernate.hbm2ddl.auto">update</prop>              
            </props>
        </property>
        <property name="annotatedClasses">
            <list>

            </list>
        </property>
    </bean> 


    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
        <property name="packagesToScan" value="QUEST.l01.Model"/>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <!-- <property name="entityManagerFactory" ref="entityManagerFactory" /> -->
    </bean>

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="showSql" value="true"/>
        <property name="generateDdl" value="true"/>
        <property name="database" value="MYSQL"/>
    </bean>

     <!-- <tx:annotation-driven transaction-manager="txManager"/> -->


    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <!-- Maximum file size: 1MB -->
        <!-- 1MB = 125000 Byte -->
        <property name="maxUploadSize" value="1000000" />

    </bean>



    <jpa:repositories base-package="QUEST.l01.Model"/>



</beans>

的security.xml

    <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.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-3.1.xsd">

         <!-- unsecured pathes (for web ressources like js, img, css -->
    <http pattern="/resources" security="none" />

        <!-- secured pathes -->
    <http auto-config="true"  use-expressions="true">
        <intercept-url pattern="/index" access="permitAll"/>
        <intercept-url pattern="/denied" access="hasRole('ROLE_USER')"/>


        <form-login login-page="/login" 
            authentication-failure-url="/login/failure" 
            authentication-success-handler-ref="AuthenticationSuccessHandler"
                />

        <access-denied-handler error-page="/denied"/>

        <logout invalidate-session="true" 
            logout-success-url="/login" 
            logout-url="/logout"/>
    </http>

        <beans:bean id="AuthenticationSuccessHandler" class="QUEST.l01.Services.CustomAuthenticationSuccessHandler"/>


    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="customUserDetailsService">
            <password-encoder hash="bcrypt"></password-encoder>
        </authentication-provider>
    </authentication-manager>


</beans:beans>

CustomUserDetailsS​​ervice的第一行:

@Service("customUserDetailsService")
@Transactional(readOnly = true)
public class CustomUserDetailsService implements UserDetailsService {

我将不胜感激任何解决方案/提示。我的理解错了什么?

1 个答案:

答案 0 :(得分:0)

请确保您的CustomUserDetailsS​​ervice类可用于扫描。 Spring将扫描base-package中可用的所有bean。

<context:component-scan base-package="com.yourapplication" />

基本包配置通常位于application-context.xml或其他配置文件中。如果尚未完成,请配置基本软件包。另外,请确保使用以下代码启用了注释。

<mvc:annotation-driven />

它将声明对注释驱动的MVC控制器的明确支持,例如@RequestBody。