Репозиторий JPA данных Spring не найден, когда аннотации Apache Shiro включены весной - PullRequest
2 голосов
/ 18 ноября 2011

Вот проблема.

У меня есть весна 3.0.5, использующая новый модуль хранилища данных DATA JPA (расширение интерфейсов CrudRepository<T, ID extends Serializable>).

У меня Apache Shiro 1.1.0 в качестве решения для безопасности моего приложения. Апач широ настроен в XML-файле определения bean-компонента Spring:

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

<!-- Enable Shiro Annotations for Spring-configured beans.  Only run after -->
<!-- the lifecycleBeanProcessor has run: -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean> 

<!-- Define the realm you want to use to connect to your back-end security datasource: -->
<bean id="securityDAORealm" class="com.bilto.archiweb.security.SecurityDAORealm" />

<bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
    <!-- Single realm app.  If you have multiple realms, use the 'realms' property instead. -->
    <property name="realm" ref="securityDAORealm"/>
</bean>

<!-- For simplest integration, so that all SecurityUtils.* methods work in all cases, -->
<!-- make the securityManager bean a static singleton.  DO NOT do this in web         -->
<!-- applications - see the 'Web Applications' section below instead.                 -->
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
    <property name="arguments" ref="securityManager"/>
</bean> 

Обратите внимание, что мое приложение является автономным приложением, и эта конфигурация Apachoe Shiro отражает его.

Конфигурация для репозиториев Spring jpa, а также стандартные конфигурации Spring (сканирование аннотаций) сконфигурирована в других файлах, они, похоже, не подходят для этой проблемы, поэтому я пропущу их печать.

Мой класс SecurityDAORealm автоматически подключается CredentialsRepository в качестве интерфейса контроллера репозитория jpa (CredentialsRepository extends CrudRepository<T, ID extends Serializable>), который служит для доступа к базе данных, в которой хранятся учетные данные.

@Component
public class SecurityDAORealm extends AuthorizingRealm {

@Autowired
CredentialRepository credentialRepository;
...
}

Теперь о проблеме.

Когда настроено сканирование аннотаций Apache Shiro, бин с автопроводкой типа CredentialsRepository не найден и, следовательно, не подключен. Когда сканирование аннотаций отключено, переменная CredentialsRepository автоматически подключается и все работает правильно.

Эта часть, которая включает обработку аннотаций Apache Shiro, выглядит так:

    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

<!-- Enable Shiro Annotations for Spring-configured beans.  Only run after -->
<!-- the lifecycleBeanProcessor has run: -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean> 

Комментируя его центральный мир

<!-- <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/> -->

Аннотации отключены, раскомментирование снова включит их.

В качестве теста я попытался автоматически подключить простое pojo вместо моего CredentialsRepository, это хорошо работает в обоих случаях (аннотации вкл / выкл).

Я не особо разбираюсь во внутренних пружинах. Здесь может произойти то, что переменная CredentialsRepository не подключается автоматически, поскольку Spring не имеет возможности создать соответствующую реализацию (SimpleJpaRepository) на своем бэкэнде.

Обходной путь существует здесь просто путем автоматического подключения контроллера JPA «полного класса» вместо реализации интерфейса с пружинным управлением.

Однако мне любопытно, является ли это ошибкой, которую необходимо исправить, или здесь существует какая-то дополнительная магия пружин, которая может заставить его работать также с интерфейсами данных пружин.

Ответы [ 2 ]

5 голосов
/ 10 февраля 2012

Я столкнулся с той же проблемой.

Мой обходной путь - сделать так, чтобы securityManager зависел от репозитория, который нужно добавить. Таким образом, в вашем случае:

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"
  depends-on="userRepository">
    <property name="realm" ref="credentialRepository" />
</bean>
3 голосов
/ 11 января 2012

У меня была похожая ситуация с этим, я не использую Широ для обеспечения безопасности, но я использую Spring Security.

Когда я выполнял автоматическое подключение, он не вводился правильно из-за инициализации bean-компонентов безопасности Spring перед сканированием компонента на наличие данных-пружин @Repository. Поскольку пружинная защита должна быть инициализирована при запуске контейнера, чтобы настроить фильтры сервлетов и тому подобное, мне пришлось подключить свои репозитории до пружинной безопасности, чтобы обеспечить правильное внедрение.

Знайте, что это не совсем ваша ситуация, но, возможно, это поможет!

Кроме того, самая запутанная часть и то, что привело меня к решению проблемы, я настроил модульный тест, который @Autowired UserDetailsService, в который вставлен репозиторий, и модульный тест работал нормально. Это заставило меня поверить, что это была проблема с порядком настройки бобов.

...