没有定义名为 'myUserDetailsService' 的 bean Spring 具有休眠和 Spring MVC 的安全性
No bean named 'myUserDetailsService' is defined Spring Security with hibernate and Spring MVC
我正在关注 this tutorial,但我需要在没有 hbm.xml 文件的情况下进行查询,而是使用 dao 和服务层。我已经使用休眠为用户和 user_roles 表生成了模型。我还创建了 dao 和服务层。
问题是我收到一条错误消息,提示没有定义名为 'myUserDetailsService' 的 bean。我知道我必须创建一个 bean,但我不知道该怎么做。
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myUserDetailsService' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:641)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1159)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:282)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
... 93 more
我已经将完整的项目上传到 github。感谢任何帮助/建议。
https://github.com/kunal7L/Spring-MVC-Security-Hibernate
我的豆子:
<bean id="userDao" class="com.mkyong.users.dao.UserDaoImpl">
<property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</bean>
<bean id="userService" class="com.mkyong.users.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- <bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService"> -->
<!-- <property name="userDao" ref="userDao" /> -->
<!-- </bean> -->
完整的 MyUserDetailsService Class:
public class MyUserDetailsService 实现 UserDetailsService {
private UserService userservice;
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
// Programmatic transaction management
/*
return transactionTemplate.execute(new TransactionCallback<UserDetails>() {
public UserDetails doInTransaction(TransactionStatus status) {
com.mkyong.users.model.User user = userDao.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRole());
return buildUserForAuthentication(user, authorities);
}
});*/
Users user = userservice.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRoleses());
return buildUserForAuthentication(user, authorities);
}
// Converts com.mkyong.users.model.User user to
// org.springframework.security.core.userdetails.User
private User buildUserForAuthentication(Users user, List<GrantedAuthority> authorities) {
return new User(user.getUsername(), user.getPassword(), user.isEnabled(), true, true, true, authorities);
}
private List<GrantedAuthority> buildUserAuthority(Set<UserRoles> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// Build user's authorities
for (UserRoles userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}
List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
return Result;
}
}
错误很明显:
No bean named 'myUserDetailsService' is defined
在您的文件 spring-security.xml 中,您引用了一个名为 myUserDetailsService 的 bean:
<authentication-manager>
<authentication-provider user-service-ref="myUserDetailsService" >
<password-encoder hash="bcrypt" />
</authentication-provider>
</authentication-manager>
但是,您在 spring-database.xml
中注释掉了定义该服务的部分
<!-- <bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService"> -->
<!-- <property name="userDao" ref="userDao" /> -->
<!-- </bean> -->
这就是错误发生的原因
很可能你的 Dao 对象有问题,我不确定你是如何设置的,但如果你使用注释,那么你必须配置你 persistance.xml 并将它放在 META-INF 文件夹中,然后你需要让应用程序上下文知道这 link 将帮助您更好地理解您的问题
http://www.journaldev.com/3531/spring-mvc-hibernate-mysql-integration-crud-example-tutorial
只需查找 Hibernate 数据源配置以及如何在 Dao 层中使用它。
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url"
value="jdbc:mysql://localhost:3306/TestDB" />
<beans:property name="username" value="pankaj" />
<beans:property name="password" value="pankaj123" />
</beans:bean>
我通过理解Hoàng Long的逻辑解决了它。我知道我错过了一个豆子,但我只是不知道在里面引用什么。所以我用谷歌搜索,发现 MyUserDetailsService 在 UserDetailsService 上实现,它是 Spring 安全的一部分。所以剩下要做的唯一一件事就是添加根本没有 属性 的 bean。
<bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService" >
</bean>
我正在关注 this tutorial,但我需要在没有 hbm.xml 文件的情况下进行查询,而是使用 dao 和服务层。我已经使用休眠为用户和 user_roles 表生成了模型。我还创建了 dao 和服务层。
问题是我收到一条错误消息,提示没有定义名为 'myUserDetailsService' 的 bean。我知道我必须创建一个 bean,但我不知道该怎么做。
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myUserDetailsService' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:641)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1159)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:282)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
... 93 more
我已经将完整的项目上传到 github。感谢任何帮助/建议。
https://github.com/kunal7L/Spring-MVC-Security-Hibernate
我的豆子:
<bean id="userDao" class="com.mkyong.users.dao.UserDaoImpl">
<property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
</bean>
<bean id="userService" class="com.mkyong.users.service.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- <bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService"> -->
<!-- <property name="userDao" ref="userDao" /> -->
<!-- </bean> -->
完整的 MyUserDetailsService Class:
public class MyUserDetailsService 实现 UserDetailsService {
private UserService userservice;
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
// Programmatic transaction management
/*
return transactionTemplate.execute(new TransactionCallback<UserDetails>() {
public UserDetails doInTransaction(TransactionStatus status) {
com.mkyong.users.model.User user = userDao.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRole());
return buildUserForAuthentication(user, authorities);
}
});*/
Users user = userservice.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRoleses());
return buildUserForAuthentication(user, authorities);
}
// Converts com.mkyong.users.model.User user to
// org.springframework.security.core.userdetails.User
private User buildUserForAuthentication(Users user, List<GrantedAuthority> authorities) {
return new User(user.getUsername(), user.getPassword(), user.isEnabled(), true, true, true, authorities);
}
private List<GrantedAuthority> buildUserAuthority(Set<UserRoles> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// Build user's authorities
for (UserRoles userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}
List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
return Result;
}
}
错误很明显:
No bean named 'myUserDetailsService' is defined
在您的文件 spring-security.xml 中,您引用了一个名为 myUserDetailsService 的 bean:
<authentication-manager>
<authentication-provider user-service-ref="myUserDetailsService" >
<password-encoder hash="bcrypt" />
</authentication-provider>
</authentication-manager>
但是,您在 spring-database.xml
中注释掉了定义该服务的部分<!-- <bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService"> -->
<!-- <property name="userDao" ref="userDao" /> -->
<!-- </bean> -->
这就是错误发生的原因
很可能你的 Dao 对象有问题,我不确定你是如何设置的,但如果你使用注释,那么你必须配置你 persistance.xml 并将它放在 META-INF 文件夹中,然后你需要让应用程序上下文知道这 link 将帮助您更好地理解您的问题 http://www.journaldev.com/3531/spring-mvc-hibernate-mysql-integration-crud-example-tutorial 只需查找 Hibernate 数据源配置以及如何在 Dao 层中使用它。
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
<beans:property name="url"
value="jdbc:mysql://localhost:3306/TestDB" />
<beans:property name="username" value="pankaj" />
<beans:property name="password" value="pankaj123" />
</beans:bean>
我通过理解Hoàng Long的逻辑解决了它。我知道我错过了一个豆子,但我只是不知道在里面引用什么。所以我用谷歌搜索,发现 MyUserDetailsService 在 UserDetailsService 上实现,它是 Spring 安全的一部分。所以剩下要做的唯一一件事就是添加根本没有 属性 的 bean。
<bean id="myUserDetailsService" class="com.mkyong.users.service.MyUserDetailsService" >
</bean>