SpringBoot之整合SpringSecurity,為自己的系統提供安全保障

資料載入中發表於2018-05-08
by 楊樂

需求:

        1.許可權控制:角色有多種角色,每個角色對應多個使用者,每個角色又對應不同的選單許可權

        2.資源控制:

                        ①有些地址只能當使用者登入之後才能訪問

                        ②有些地址可以對無狀態使用者開放,例如API

                        ③對不同角色的使用者的訪問的許可權進行控制

                        …

         3.系統登入與登出:登入成功後將使用者資訊儲存在系統中,轉向成功頁面,否則重新指向到登入頁面,並提示錯誤資訊

初步解決方案:

            使用filter完成所有需求:

            ①將使用者登入的資訊儲存在session中,在filter進行判斷,請求的地址是否是在登入  之後才能訪問,然後寫一堆if判斷,解決問題1

          ②解決方法和問題①一樣的,在filter中進行過濾

           ③對不同角色有不同的許可權則也可以在filter中操作,根據使用者資訊查到使用者所屬角                                  色,再進行判斷,解決問題。

            ④系統的登入和登出可以使用一個action,在action中進行這些邏輯處理。解決問題

遇到的問題:

        在使用如上方法完成需求之後,反過來看,會發現有好多冗餘程式碼,使系統變得臃腫,光 filter裡面就會出現大量的if語句,而且系統程式碼並不能被下一個系統直接複用,沒有將功能進行模組化的開發。

最終解決方案:

      使用springboot 對spring security進行整合:

           為什麼使用security?

                    ①Spring Security是能夠為J2EE專案提供綜合性的安全訪問控制解決方案的安全框架;

                    ②Spring Security 完美的解決了我以上的需求

                    ③有了security我可以更加便捷的管理我的系統,攔截一個地址,不再需要我去配置一                       個filter,只需要新增一個配置就能搞定了,廢話不多說進入正題吧:

開始coding吧

spring security的starterMaven包:

security maven

一、首先進行安全入口的配置:

WebSecurityConfig.java

         WebSecurityConfig 繼承WebSecurityConfigurerAdapter重寫config,configureGlobal方法

WebSecurityConfig.java

這裡面可以配置不需要攔截的url,和登入,登出後的處理頁面,還能新增認證資料來源,再登入時獲取額外的引數,例如後面提到的驗證碼等引數

WebSecurityConfig.java

這個方法用來載入 處理登入的邏輯程式碼(使用者名稱,密碼,驗證碼等邏輯驗證)

二、使用者驗證

CustAuthenticationProvider.java 實現AuthenticationProvider介面中的authenticate方法進行登入認證

CustAuthenticationProvider.java

三、封裝使用者資訊類

CustUserDetails.java 實現UserDetails介面

CustUserDetails.java

四、根據使用者名稱獲取使用者資訊

SnailUserDetailsService.java 實現UserDetailsService介面中的loadUserByUsername方法,從資料庫中載入使用者資訊並封裝到CustUserDetails中返回

SnailUserDetailsService.java 

五、新增額外引數驗證:

在普通的認證中,我們只能對使用者名稱和密碼進行驗證,不能夠獲取表單中額外引數進行驗證(如驗證碼),但是security給我們開啟了一扇門,還記得步驟一中的authenticationDetailsSource這個原始碼,這個就是載入額外資料來源引數,我們只需建立一個類實現AuthenticationDetailsSource介面中的buildDetails方法,將我們需要的額外引數載入進來即可

CustomAuthenticationDetailsSource.java實現AuthenticationDetailsSource介面

CustomAuthenticationDetailsSource.java

建立CustomWebAuthenticationDetails.java繼承WebAuthenticationDetails載入引數

CustomWebAuthenticationDetails.java

六、到這裡,所有程式碼都寫完了,我們還有一個需求就是如何在專案中獲取使用者資訊:security提供了SecurityContextHolder這個類,能夠幫助我們獲取使用者的所有資訊,使用方式如下:

controller

附上所有程式碼下載連結,使用時請大家根據自己的開發環境進行相應的調整,如果沒有積分的可以留言,我會上傳到百度雲中,提供你們下載。

csdn:https://download.csdn.net/download/weixin_34311210/10400629

百度雲:https://pan.baidu.com/s/1NNgCgk_2iqjMgq6tgeJEog


相關文章