創建資料庫 前面介紹了springboot security整合jdbc從資料庫中查詢用戶的方式,適用性有限,下麵介紹最常用的整合MyBatis,這種在開發和生產環境中是最常用,也是最實用的。首先需要創建資料庫表,我們來創建三張表,分別是用戶表,角色表,還有用戶角色表,首先看用戶表: 只有三個欄位, ...
創建資料庫
前面介紹了springboot-security整合jdbc從資料庫中查詢用戶的方式,適用性有限,下麵介紹最常用的整合MyBatis,這種在開發和生產環境中是最常用,也是最實用的。首先需要創建資料庫表,我們來創建三張表,分別是用戶表,角色表,還有用戶角色表,首先看用戶表:
只有三個欄位,具體業務中需要幾個欄位完全由我們自己設計。密碼是admin,是加密的,後面的配置中會看到加密方式,與前面介紹的在記憶體中配置預設用戶的方式類似。下麵看角色表:
註意每個角色名字的前面都加了一個ROLE_首碼,最後來看用戶角色表:
我們給用戶只分配了一個角色。
創建實體類
我們從基本做起,來創建實體類,首先創建角色實體類 SysRole,
除了基本的id和role欄位,SysRole還實現了GrantedAuthority介面,實現了getAuthority方法,這個方法返回的就是角色的名字,後面會看到專門實現這個介面的好處。下麵來看用戶實體類 SysUser:
用戶名最好是username,密碼最好是password,這樣命名是security預設支持的命名。這個是原生的用戶實體類,除了id和用戶名密碼,加入了一個角色列表屬性,用以返回當前用戶擁有哪些角色,不過為了配合security的使用,最好給用戶實體類實現一個介面UserDetails:
然後實現介面的下麵幾個方法:
其中比較重要的是最後一個獲取角色列表的方法,這是security預設的方法。由於我們角色實體類實現了GrantedAuthority介面,所以這裡可以直接返回上面定義的角色列表。還有一些其它的屬性都是security預設設計的用戶屬性,從字面意思可以看出是判斷超時,鎖定,能否登陸之類的,如果想用可以定義對應的欄位,如果不想用直接返回true即可。
創建mapper
在springboot中整合mybatis就不再介紹了。下一步創建mapper介面,內容很簡單,就是根據用戶名查詢用戶:
來看sql語句,我們要一步到位,把用戶和用戶擁有的角色都查出來,這裡使用一個一對多查詢:
security配置類
配置類中把前面的jdbc配置可以刪除了,我們來重寫兩個方法,配置用戶名密碼的驗證和密碼的加密:
這裡我們查詢到用戶的時候直接返回的用戶,是因為用戶類實現了對應的介面,所以操作很方便,而且返回的內容中包含了角色信息。下麵在auth中配置了登錄驗證方式和密碼加密方式。
測試
上面的內容以及配置完了,我們重啟項目就可以使用admin/admin登錄:
訪問/two和/three頁面:
可以看到以非常個性化的自定義方式完成了用戶的認證和授權。來查看當前用戶信息:
在實際的開發中,用戶表肯定會有更加豐富的欄位,使用用戶類實現UserDetails介面的形式能更好的獲取用戶信息。
註意,新增用戶的時候,密碼要使用 new BCryptPasswordEncoder().encode("admin") 的方式加密,新增角色的時候,前面要加上ROLE_首碼,這是預設的規則。
代碼地址:https://gitee.com/blueses/spring-boot-security 08