Вот проблема.
У меня есть весна 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 «полного класса» вместо реализации интерфейса с пружинным управлением.
Однако мне любопытно, является ли это ошибкой, которую необходимо исправить, или здесь существует какая-то дополнительная магия пружин, которая может заставить его работать также с интерфейсами данных пружин.