Spring-Security (學習記錄三)--讀取數據庫中的用戶和角色


用數據庫中的用戶跟角色替換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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM