Вот в чем проблема.
У меня есть spring 3.0.5, использующий новый модуль репозитория DATA JPA (интерфейсы, расширяющие CrudRepository<T, ID extends Serializable>
).
У меня есть Apache Shiro 1.1.0 в качестве решения для обеспечения безопасности моего приложения. Apache shiro настраивается в 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, автосвязанный bean-компонент типа 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 «полного класса» вместо реализации интерфейса, управляемого пружиной.
Однако мне любопытно, является ли это ошибкой, которую необходимо исправить, или существует ли здесь какая-то дополнительная пружинная магия, которая может заставить ее работать также с интерфейсами данных Spring.