我试图在Spring和MongoDB中使用Apache Shiro.我正在使用自动装配的Spring Data Repositories.我为Shiro创建了自己的自定义域,它使用Spring Data存储库与Mongo交谈:public class PlatformRealm extends AuthorizingR...
我试图在Spring和MongoDB中使用Apache Shiro.我正在使用自动装配的Spring Data Repositories.我为Shiro创建了自己的自定义域,它使用Spring Data存储库与Mongo交谈:
public class PlatformRealm extends AuthorizingRealm {
@Autowired(required = true)
protected UserRepository userRepository = null;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
...
}
}
我看到的问题是userRepository没有自动装配.我在控制台输出中得到以下行,引用PlatformRealm:
INFO org.springframework.web.context.support.XmlWebApplicationContext - Bean 'platformRealm' of type [class com.resonance.platform.core.security.PlatformRealm] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
这是因为Apache Shiro ShiroFilterFactoryBean.发生了什么事情是这个bean及其所有依赖项在容器启动时立即被加载.在解析依赖项之前,它不会等待我的持久性bean被初始化.这会导致存储库引用为null.
通过contextConfigLocation参数加载以下bean配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/web-platform-persistence.xml,
/WEB-INF/web-platform-services.xml
</param-value>
</context-param>
服务bean配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<bean id="userSession"
class="com.resonance.platform.web.core.services.ShiroUserSessionService" />
<!-- Shiro (Security) -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login" />
<property name="successUrl" value="/" />
<!-- The 'filters' property is not necessary since any declared javax.servlet.Filter
bean -->
<!-- defined will be automatically acquired and available via its beanName
in chain -->
<!-- definitions, but you can perform instance overrides or name aliases
here if you like: -->
<!-- <property name="filters"> <util:map> <entry key="anAlias" value-ref="someFilter"/>
</util:map> </property> -->
<property name="filterChainDefinitions">
<value>
# some example chain definitions:
/admin/** = passThruFilter, roles[admin]
/** = passThruFilter
</value>
</property>
</bean>
<bean id="passThruFilter"
class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter" />
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- Single realm app. If you have multiple realms, use the 'realms' property
instead. -->
<property name="realm" ref="platformRealm" />
<!-- By default the servlet container sessions will be used. Uncomment
this line to use shiro's native sessions (see the JavaDoc for more): -->
<!-- <property name="sessionMode" value="native"/> -->
</bean>
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
<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 Shiro Realm implementation you want to use to connect to
your back-end -->
<!-- security datasource: -->
<bean id="platformRealm" class="com.resonance.platform.core.security.PlatformRealm" />
持久性bean配置:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<mongo:mongo id="mongo" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo" />
<constructor-arg value="platform" />
<property name="writeConcern">
<util:constant static-field="com.mongodb.WriteConcern.SAFE" ></util:constant>
</property>
</bean>
<mongo:repositories base-package="com.resonance.platform.core.data.repositories" />
用户存储库:
package com.resonance.platform.core.data.repositories;
import org.bson.types.ObjectId;
import org.springframework.data.repository.CrudRepository;
import com.resonance.platform.core.entities.User;
/**
* A repository used to manage User entities.
* @author Kyle
*/
public interface UserRepository extends CrudRepository<User, ObjectId> {
/**
* Gets a user by the specified login.
* @param login
* @return
*/
User getByLogin(String login);
}
我的问题是,如何正确解析userRepository依赖关系?我知道ShiroFilterFactoryBean必须在其他依赖项和诸如此类之前初始化,但必须有一种方法来解析userRepository依赖项.
编辑:添加了用户存储库代码.
解决方法:
我遇到了这里描述的同样问题.
我注意到两个春天的工厂.
>来自dispacher-servlet.xml,它由于在基本包级别定义的组件扫描而加载@Service @Repository类,因此我可以@Autowire Service类进入Controller.
>从应用程序上下文似乎@Autowire类标记为@Service,因为它们未加载.
本文标题为:java – Spring MongoDB和Apache Shiro
基础教程推荐
- Mybatis-Plus使用updateById()、update()将字段更新为null 2023-04-06
- Spring注解Autowired的底层实现原理详解 2023-06-24
- Spring项目XML文件使用小结 2023-03-07
- java中使用url进行编码和解码 2023-04-17
- Java代码规范与质量检测插件SonarLint的使用 2023-03-31
- SpringBoot加密配置文件的SQL账号密码方式 2023-01-13
- Java代码实现酒店管理系统 2022-11-20
- Java实现部门员工管理 2023-05-08
- Java躲不过设计模式的坑之代理模式详解 2023-05-14
- SpringBoot Controller中的常用注解 2023-05-19