不少人以爲Spring Security實現登陸驗證很難,我最開始學習的時候也這樣以爲。由於我很久都沒看懂我該怎麼樣將本身寫的用於接收用戶名密碼的Controller與Spring Security結合使用,這是一個先入爲主的誤區。後來我搞懂了:根本不用你本身去寫Controller。你只須要告訴Spring Security用戶信息、角色信息、權限信息、登陸頁是什麼?登錄成功頁是什麼?或者其餘有關登陸的一切信息。具體的登陸驗證邏輯它來幫你實現。html
在本號以前的文章中,已經介紹了Spring Security的formLogin登陸認證模式,RBAC的權限控制管理模型,而且針對Spring Security的登陸認證邏輯源碼進行了解析等等。咱們全部的用戶、角色、權限信息都是在配置文件裏面寫死的,然而在實際的業務系統中,這些信息一般是存放在RBAC權限模型的數據庫表中的。下面咱們來回顧一下其中的核心概念:java
以上是對一些核心的基礎知識的總結,若是您對這些知識還不是很清晰,建議您先往下讀本文。若是看完本文仍然理解困難,建議您翻看本號以前的文章。spring
下面咱們來看一下UserDetails接口都有哪些方法。數據庫
public interface UserDetails extends Serializable { //獲取用戶的權限集合 Collection<!--? extends GrantedAuthority--> getAuthorities(); //獲取密碼 String getPassword(); //獲取用戶名 String getUsername(); //帳號是否沒過時 boolean isAccountNonExpired(); //帳號是否沒被鎖定 boolean isAccountNonLocked(); //密碼是否沒過時 boolean isCredentialsNonExpired(); //帳戶是否可用 boolean isEnabled(); }
如今,咱們明白了,只要咱們把這些信息提供給Spring Security,Spring Security就知道怎麼作登陸驗證了,根本不須要咱們本身寫Controller實現登陸驗證邏輯。springboot
public class SysUser implements UserDetails{ String password(); //密碼 String username(); //用戶名 boolean accountNonExpired; //是否沒過時 boolean accountNonLocked; //是否沒被鎖定 boolean credentialsNonExpired; //是否沒過時 boolean enabled; //帳號是否可用 Collection<!--? extends GrantedAuthority--> authorities; //用戶的權限集合 //省略構造方法 //省略set方法 //省略get方法(即接口UserDetails的方法) }
咱們就是寫了一個適應於UserDetails的java POJO類,所謂的 UserDetails接口實現就是一些get方法。get方法由Spring Security調用,咱們經過set方法或構造函數爲 Spring Security提供UserDetails數據。ide
@Component public class MyUserDetailsService implements UserDetailsService{ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { //這裏從數據庫sys_user表裏面查詢實體類對象。loadUser方法可以使用Mybatis或JDBC或JPA自行實現。 SysUser sysUser = loadUser(username); // 判斷用戶是否存在 if(user == null) { throw new UsernameNotFoundException("用戶名不存在"); } //從數據庫該用戶全部的角色信息,全部的權限標誌 //遍歷全部的ROLE角色及全部的Authority權限(菜單、按鈕)。 //用逗號分隔他們的惟一標誌,具體過程自行實現。 sysUser.setAuthorities( AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_AMIN , system:user:delete")); //sysUser.setAccountNonLocked(true或false); return sysUser; } }
至此,咱們將系統裏面的全部的用戶、角色、權限信息都經過UserDetailsService和UserDetails告知了Spring Security。可是多數朋友可能仍然不知道該怎樣實現登陸的功能,其實剩下的事情很簡單了:函數
而後把這些信息經過配置方式告知Spring Security ,以上的配置信息名稱均可以靈活修改。若是您不知道如何配置請參考本號以前的文章《formLogin登陸認證模式》。post