spring-security-4 (5)spring security Java配置實現自定義表單認證與受權

   前面三篇講解了spring security的搭建以及簡單的表單認證與受權原理。本篇將實現咱們自定義的表單登陸與認證。html

   本篇不會再講項目的搭建過程,由於跟第二節的搭建一模一樣。本篇也不會將項目中全部的代碼所有給出,由於代碼量有點大。項目的代碼被放在了github上,請拉下來根據講解去看代碼,代碼的註釋寫的也比較詳細。github地址https://github.com/wutianqi/spring_security_extend.git。另外,由於項目中使用了mysql數據庫,對於表結構和數據這裏截圖會很明白的給出。mysql

1、項目結構及表結構

1.項目結構git

2.表結構github

  數據庫名:web

  角色表(role):spring

  用戶表(user):sql

  用戶角色表(user_role):數據庫

 

2、項目功能

  在講解代碼以前仍是要介紹一下本項目利用spring security實現的功能,便於讀者分析代碼。api

  1. 本項目圍繞着admin.jsp,user.jsp,other.jsp展開。安全

      a. admin.jsp只有admin角色的用戶才能夠訪問,ls擁有admin角色。

      b. user.jsp有user角色或admin角色均可以訪問,zs擁有user角色。

      c. other.jsp只要用戶登陸就能夠訪問,ww什麼角色都沒有。爲了簡單起見,項目中other.jsp就表明其餘任何登陸後就能夠訪問的路徑

  2. 用戶訪問受保護的頁面時,會被要求登陸:

  3.用戶在登陸時,若是用戶名或密碼輸入錯誤,會在登陸頁提示

  4.登陸成功後,若是有權限訪問請求的頁面,則會跳到該頁面,好比擁有user角色的zs登陸後,訪問user.jsp

  相反,若是訪問只有admin角色才能夠訪問的admin.jsp,則會提示權限不足

  5.點擊退出登陸,則會提示退出成功

 

  6.不需登陸就能夠訪問的頁面,能夠不登陸直接訪問,好比項目的index.jsp

 

 

3、代碼解讀

  關於spring security認證與受權原理的講解在前一篇講的比較清楚了,這裏再也不詳細介紹,這裏只介紹一下本身認爲比較重要的代碼。若是讀者有什麼疑問,請留言,我會及時解答!

  1.MySecurityConfig

  spring secuirty提供了一種後處理bean方式提供一個自定義配置過濾器的口子,就是下面這段代碼

  這段代碼對FilterSecurityInterceptor的AccessDecisionManager屬性進行了自定義的配置。目的是讓spring security用咱們自定義的AccessDecisionManager。

  2.MyAccessDecisionManager

  在用戶沒有登陸時,decide中的authentication參數是AnonymousAuthenticationToken,此時他會有ROLE_ANONYMOUS的角色,就是匿名角色。這是AnonymousAuthenticationFilter來作的。

  這樣下面這段代碼就好理解了

if(authorityString.contains("ROLE_ANONYMOUS")) {
            //未登陸
            throw new AccessDeniedException("未登陸");
}

   3.MyAuthenticationProvider

  咱們的MyAuthenticationProvider繼承了AbstractUserDetailsAuthenticationProvider,咱們自定義provider的真正認證過程實際發生在AbstractUserDetailsAuthenticationProvider的authenticate中。咱們的MyAuthenticationProvider只是實現了retrieveUser來獲取用戶信息並在其中檢查用戶名是否存在,以及實現了additionalAuthenticationChecks檢驗用戶輸入的密碼。其餘一些諸如填充完整的Authentication的行爲交給父類來作了。由於父類處理的很好因此咱們無須本身再作。MySuccessHandler也是將認證成功後的處理都交給父類去處理了。

4、總結

  要對本節的代碼作到理解。上篇博文的講解相當重要。

  本spring security系列,只是對咱們web應用中常見的表單認證與登陸進行了講解。spring security還有不少安全功能。好比方法安全,域安全等。本文沒有進行講解。想了解更多,能夠查看官方文檔。本身之後也會再學,到時候也會再寫相關博文。

  最後,對於本文有疑問的地方歡迎提問!

 

參考資料:http://www.tianshouzhi.com/api/tutorials/spring_security_4/250

     https://docs.spring.io/spring-security/site/docs/4.1.3.RELEASE/reference/htmlsingle/

相關文章
相關標籤/搜索