使用Spring Security自动连接依赖注入

时间:2013-05-09 05:57:40

标签: java spring hibernate dependency-injection spring-security

我有一个带注释驱动配置的spring webapp。

所有控制器,存储库都是自动装配的。

在集成Spring Security时,我定义了一个单独的security-app.xml。我创建了一个名为LoginUserService的服务,它实现了UserDetailsS​​ervice。现在调用此类的方法loadUserByUsername()方法进行身份验证。

此类具有UserRepository的自动连接依赖项。现在这个自动连接的依赖关系变成了null。为了解决这个问题,我启用了注释驱动配置,并在组件扫描配置中添加了存储库类的包名称。

此处还讨论了此解决方案 spring security with custom user details

但现在的问题是UserRepository有一个带有@PersistenceContext注释的EntityManager字段。对于spring安全配置,它能够找到UserRepository但无法找到实体管理器。我应该在这里创建一个新的EntityManagerFactory吗?我想这将在我的应用程序中创建两个持久性单元?

如何将自动连接的依赖项注入使用原始servlet xml创建的UserRepository?

更新

这里简要讨论一下: https://stackoverflow.com/a/7078395/161628

但我想一个规范的详细答案对我来说会更有用。

更新

如何使用ApplicationContext在运行时获取UserRepository?

if (userRepository == null) {
    userRepository = ApplicationContextProvider.getApplicatonContext().getBean(UserRepository.class);
}

Why is Spring's ApplicationContext.getBean considered bad?

1 个答案:

答案 0 :(得分:1)

编辑:您在DispatcherServlet的配置中声明的Bean将无法用于您在contextConfigLocation配置文件中声明或组件扫描的任何Bean。因此,在这种情况下,如果您在为DispatcherServlet加载的配置文件中设置JPA配置,则无法将其连接到您在安全配置中声明的bean。您需要将任何“核心”bean配置(数据源配置,数据库连接池配置,JPA / Hibernate配置,存储库/服务组件扫描等)移动到您通过contextConfigLocation加载的配置文件中。然后,这些东西将可用于您的安全bean和您的MVC bean。我认为通常的想法是只在DispatcherServlet配置中加载MVC特定的bean(例如控制器,视图,请求处理程序,请求范围的bean等)。这样,您可以确保在MVC代码和非MVC代码之间实现清晰的分离,只需要从MVC代码到“核心”代码的单向依赖关系,并且在“核心”代码中不依赖于MVC代码。这有助于使您的代码更加模块化,并且可以更轻松地以其他方式重用“核心”代码,特别是在单元测试中。

(原始评论文本询问如何加载安全配置,如果它在contextConfigLocation或其他地方。)