简体   繁体   中英

spring security bean not found exception

I'm trying to set up spring security for an mvc project, and I'm having a hard time. I'm using the spring security 3.1.4.Release. I have a spring-security.xml file set up along with and mvc-dispatcher-servlet file set up for configuration. Right now I'm getting a bean not found exception for my User Details Bean.

In intellij I get a "cannot resolve bean" message for the myUserDetailService. I also cannot resolve the package "controller". The root error when I run the project is:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0': Cannot resolve reference to bean 'myUserDetailService' while setting bean property 'userDetailsService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myUserDetailService' is defined
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:329) [spring-beans-3.2.0.RELEASE.jar:3.2.0.RELEASE]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:107) [spring-beans-3.2.0.RELEASE.jar:3.2.0.RELEASE]

Here is my spring-security.xml file:

<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:beans="http://www.springframework.org/schema/beans"
         xmlns:context="http://www.springframework.org/schema/context"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


<!-- Enabling Spring beans auto-discovery -->
   <context:component-scan base-package="controller, com.company.admin" />

<http auto-config="true">
    <intercept-url pattern="/admin/*" access="ROLE_USER"  />
    <form-login login-page="/login" default-target-url="/admin/welcome"   authentication-failure-url="/loginfailed" />
    <logout logout-success-url="/logout" />
</http>

<authentication-manager>
    <authentication-provider user-service-ref="myUserDetailService"/>
</authentication-manager>

</beans:beans>

Here is my mvc-dispatcher-servlet.xml:

<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: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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">


<!-- Enabling Spring beans auto-discovery -->
<context:component-scan base-package="com.company.admin" />

<!-- Enabling Spring MVC configuration through annotations -->
<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>
</beans>

Here is my web.xml:

<web-app 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>Spring MVC Application</display-name>


<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>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/mvc-dispatcher-servlet.xml,
        /WEB-INF/spring-security.xml
    </param-value>
</context-param>

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

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

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
</web-app>

I'm basically trying to follow this tutorial: http://kh-yiu.blogspot.com/2012/12/spring-mvc-security-custom.html and the UserDetailServiceImpl is pretty identical to that, but I do have it in a different folder in my main/java directory. It's important to note I use annotations to declare the class:

@Service("myUserDetailService")
public class UserDetailsServiceImpl implements UserDetailsService{

Any ideas? I'm having a very hard time finding tutorials with the same spring version that I'm using, so it's quite possible I've messed up xsd refs. Thanks.

You are adding a reference to:

<authentication-provider user-service-ref="myUserDetailService"/>

You need a bean with that id.. something like:

<bean id="myUserDetailService" class="the.class.of.your.service"></bean>

Just break a bit your exception:

//Error creating the bean
Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0': 
//The myUserDetailService reference cannot be solved, it cannot be found or it has syntax error or something is wrong there
Cannot resolve reference to bean 'myUserDetailService' while setting bean property 'userDetailsService'; 
//The root cause is an exception deeper.
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
//You don't have a bean with this name:
No bean named 'myUserDetailService' is defined

Updated:

Now that you added the @Service myUserDetailService... it may be a duplicated of why does annotate class as @Service do not create bean?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM