1

我正在尝试为 mvc 项目设置 spring 安全性,但我遇到了困难。我正在使用 spring security 3.1.4.Release。我设置了一个 spring-security.xml 文件以及用于配置的 mvc-dispatcher-servlet 文件。现在,我的用户详细信息 Bean 出现 bean not found 异常。

在 intellij 中,我收到 myUserDetailService 的“无法解析 bean”消息。我也无法解析包“控制器”。我运行项目时的根本错误是:

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]

这是我的 spring-security.xml 文件:

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

这是我的 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>

这是我的 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>

我基本上是在尝试遵循本教程: http: //kh-yiu.blogspot.com/2012/12/spring-mvc-security-custom.html和 UserDetailServiceImpl 非常相似,但我确实有它我的 main/java 目录中的另一个文件夹。重要的是要注意我使用注释来声明类:

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

有任何想法吗?我很难找到与我正在使用的相同 spring 版本的教程,所以很可能我搞砸了 xsd refs。谢谢。

4

1 回答 1

1

您正在添加对以下内容的引用:

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

您需要一个具有该 ID 的 bean .. 类似于:

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

打破一点你的例外:

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

更新:

既然您添加了@Service myUserDetailService... 它可能与为什么注释类为@Service 不创建bean 重复?

于 2013-10-01T20:41:31.777 回答