創建數據庫
前面介紹了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_前綴,這是默認的規則。