更新(提供完整示例后)
看来您有多个问题。
web.xml与AbstractAnnotationConfigDispatcherServletInitializer
您创建的应用程序有一个web.xml,用于配置名为的DispatcherServlet
mvc-dispatcher。的
mvc-dispatcher配置已将
mvc-dispatcher-servlet.xml软件包中的所有bean装入
com.springapp.sectest。这意味着
mvc-dispatcher可以找到您的
UserDetailsService。
该应用程序还具有一个AbstractAnnotationConfigDispatcherServletInitializer,它创建了一个
DispatcherServlet加载
WebConfigJava配置的文件。这
DispatcherServlet无法看到创建的豆类
mvc-dispatcher。
简而言之,您应该
DispatcherServlet使用web.xml
进行配置,或者
AbstractAnnotationConfigDispatcherServletInitializer不要同时使用两者。
getRootConfigClasses与getServletConfigClasses
getRootConfigClasses中的任何配置通常称为根配置或父配置,并且无法查看在getServletConfigClasses中定义的bean。Spring
Security使用由
@EnableWebSecurity注释创建的名为springSecurityFilterChain的过滤器保护在getRootConfigClasses中定义的应用程序。这意味着通常最好将Spring
Security的配置放在getRootConfigClasses中。对此有一些例外,例如,如果您想在Spring MVC控制器上进行方法安全性。
getServletConfigClasses中的任何配置通常都称为子配置,并且可以查看在getRootConfigClasses中定义的bean。getServletConfigClasses配置,
DispatcherServlet并且必须包含Spring
MVC的bean(即Controllers,ViewResovlers等)。getRootConfigClasses中定义的任何Spring MVC
bean都是可见的,但未使用。
这种设置虽然有点令人困惑,但允许您
DispatcherServlet使用隔离配置来拥有多个实例。实际上,很少有多个
DispatcherServlet实例。
根据上述信息,您应该将
UserDetailsService声明及其所有依赖的bean移到getRootConfigClasses。这将确保SecurityConfig.java可以找到
UserDetailsService。
拉请求修复
我已经提交了一份PR来获取您的应用程序,以便它以没有错误的开头https://github.com/worldcombined/AnnotateFailed/pull/1。一些注意事项
- 该测试未使用父级和子级上下文,因此未反映运行该应用程序
- 我不得不移动资源文件夹,以便正确拾取
- 我没有这样做,所以您实际上可以进行身份验证。没有login.jsp,并且您提供的UserDetailsService始终返回null。相反,我尝试证明这里的错误已得到解决。
原始答案
基于此评论:
@ComponentScan在我的mvc-dispatcher-servlet.xml中作为
进行
看来您是在Dispatcher配置中而不是在根上下文中配置服务。
Spring
Security的配置通常在根上下文中配置。例如,可以如下所示扩展AbstractSecurityWebApplicationInitializer:
import org.springframework.security.web.context.*;public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {}您如何导入安全配置?如果Spring Security配置在根上下文中,则它将看不到在Dispatcher Servlet上下文中定义的bean。
解决方案是在根上下文中移动服务的配置,或将Spring
Security配置移动到调度程序的ApplicationContext。例如,如果您的调度程序servlet被命名为mvc,那么将Spring
Security配置移动到调度程序上下文中将如下所示。
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { protected String getDispatcherWebApplicationContextSuffix() { return "mvc"; }}


