我一直在使用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