我一直在使用Spring Security在SpringMVC中创建有用的表单登录。我在这方面很新手,也是Hibernate。我想创建简单的表单登录,可以访问我的Web应用程序。SpringSecurity使用UserDetailsService和Hibernate登录
我已经使用SpringSource Tool Suite创建了我的项目并选择了Spring Template Project。它使用Maven,我也通过Hibernate类生成注释和hibernate.cfg.xml
。在我的数据库(HSQLDB)中,我有三个表:用户,角色和users_roles。第三个包含user_id和role_id,因此它存储有关用户角色的信息。我已经通过Hibernate生成了类。
我已经开始编写实现UserDetailsService的类。但我不知道如何正确地做到这一点。在spring-security.xml
我已经定义的bean是这样的:
<bean id="userDetailsService" class="hutter.pl.services.HutterUserDetailsService" />
我想用的SHA-256散列saltSource。
<bean class="org.springframework.security.authentication.dao.ReflectionSaltSource" id="saltSource">
<property name="userPropertyToUse" value="username"/>
</bean>
<security:authentication-manager>
<security:authentication-provider user-service-ref="userDetailsService">
<security:password-encoder hash="sha-256">
<security:salt-source ref="saltSource" />
</security:password-encoder>
</security:authentication-provider>
</security:authentication-manager>
我是否应该使用此解决方案:https://stackoverflow.com/a/1654488/845220? Hibernate拥有类似的类:RolesHome,Roles,Users,UsersHome,UsersRoles,UsersRolesHome。但我真的不知道如何使用这些冬眠班授权用户。
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
@Transactional(readOnly = true)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UsersHome usersHome = new UsersHome();
//Users user = ...
//...
return null;
}
}
你能给我一些提示吗?
编辑: 我已尝试添加方法public Users findByLogin(String login)
到UsersHome
类。
public Users findByLogin(String login) {
log.debug("getting Users instance with login: " + login);
try {
Users instance = entityManager.find(Users.class, login);
log.debug("get successful");
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
而我的UserDetailsService的身体看起来像:
UsersHome usersHome = new UsersHome();
Users user = usersHome.findByLogin(username);
但我有错误时抛出:
ERROR: my.package.dao.UsersHome - get failed
java.lang.NullPointerException
at my.package.dao.UsersHome.findByLogin(UsersHome.java:72)
at my.package.services.HutterUserDetailsService.loadUserByUsername(MyUserDetailsService.java:19)
我使用休眠核心版本4.1.4.FINAL和spring.framework在3.1.0.RELEASE。我读过这个版本不支持。这是真的? – woyaru 2012-07-06 12:10:27
我不明白 - 所以你返回null,然后得到一个空指针异常。您可以遍历调试器中的MyUserDetailsService.loadUserByUsername并查找出现错误的部分。 ---换句话说 - 哪个对象为空? – 2012-07-06 13:11:08
我刚刚意识到由Hibernate生成的类包含'private EntityManager entityManager;'但它没有在任何地方定义。当'entityManager'使用时,我有NullPointer。我认为Hibernate类是完整的。所以大概我应该不得不以某种我不知道的方式来管理'entityManager'。 – woyaru 2012-07-06 13:18:18