用數據庫中的用戶跟角色替換spring-security.xml中的用戶名和角色,這里我用hibernate框架來獲取數據庫中的用戶名和角色
詳情請看附件
目錄
1.先將hibernate的環境整合進來
2.創建一個數據庫security,執行security.sql
3.修改spring-security.xml,采用數據庫的方式讀取用戶跟角色
<!-- 認證管理器,配置了管理員與角色的關系 -->
<security:authentication-manager>
<!-- 配置賬號密碼所屬的角色 角色以 ROLE_開頭,為spring獲取名稱的標識 -->
<security:authentication-provider user-service-ref="accountService">
<!-- 采用xml的方式
<security:user-service>
<security:user name="user" password="user" authorities="ROLE_USER" />
<security:user name="admin" password="admin" authorities="ROLE_ADMIN" />
</security:user-service>
-->
</security:authentication-provider>
</security:authentication-manager>
- 配置文件中的accountService需要實現UserDetailsService接口,實現loadUserByUsername方法,
security框架會根據這個方法來獲取用戶信息
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return accountDao.getJoinRole(username);
}
由於這個方法返回的是UserDetails類型,所以我們的用戶類Account需要實現UserDetails接口,
在Account中。由於實現UserDetails接口,需要返回角色信息的類型為Collection<? extends GrantedAuthority>,所以我們的Role類還需要實現GrantedAuthority接口
/**
* 返回角色集合
*/
@Transient
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return roles;
}
詳情請看下面百度雲連接
注:如果項目啟動報錯,刷新maven
4.uml圖說明其中的關系
spring采用了接口的方式,來規定流程,我們需要實現相應的接口來把這個流程跑起來。
認證管理器 <security:authentication-manager>中要求我們實現UserDetailsService接口,而接口中的方法 public UserDetails loadUserByUsername(String username) 規定了我們要返回UserDetails 類型,所以我們的account需要實現UserDetails接口,接下來UserDetails接口中需要實現public Collection<? extends GrantedAuthority> getAuthorities()方法,規定了我們返回的角色role類需要實現GrantedAuthority接口。下面是圖解。

百度雲鏈接:http://pan.baidu.com/s/1geD4635 密碼:wo2i
