UserDetails接口
是什么:userDetails => Spring Security基礎接口,包含某個用戶的賬號,密碼,權限,狀態(是否鎖定)等信息。只有getter方法。 相當於定義一個規范,作用主要是用來和數據庫做交互用的。簡單來說,就是用戶名傳過來,這個類負責校驗用戶名是否存在業務邏輯。Security這個框架不管你的應用時怎么存儲用戶和權限信息的。只要你取出來的時候把它包裝成一個UserDetails對象給我用就可以了。
怎么用:只需要在包含用戶信息實體類上實現這個接口,並重寫里面的方法,下面接口里面的方法:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.springframework.security.core.userdetails; import java.io.Serializable; import java.util.Collection; import org.springframework.security.core.GrantedAuthority;
public interface UserDetails extends Serializable {
//返回用戶的所有角色
Collection<? extends GrantedAuthority> getAuthorities(); String getPassword(); String getUsername();
//賬戶是否未過期
boolean isAccountNonExpired();
//賬戶是否未鎖定
boolean isAccountNonLocked();
//憑證是否未過期
boolean isCredentialsNonExpired();
//賬戶是否可用
boolean isEnabled();
}
UserDetails用來做什么?為什么還要帶上權限集合?
把這些信息取出來,然后包裝成一個對象交由框架去認證。
登錄成功后也不是什么都能訪問的,還要根據你所擁有的權限進行判斷。有權限你才能訪問特定的對象。Security框架是這樣設計的,即認證成功后,就把用戶信息和擁有的權限都存儲在SecurityContext中,當訪問受保護資源(某個對象/方法)的時候,就把權限拿出來比對,看看是否滿足。
什么時候提供UserDetails信息,怎么提供?
那肯定是認證的時候。其實認證的操作,框架都已經幫你實現了,它所需要的只是,你給我提供獲取信息的方式。所以它就定義一個接口,然后讓你去實現,實現好了之后再注入給它。
框架提供一個UserDetailsService接口用來加載用戶信息。
UserDetailsService里面只有一個方法,作用就是通過username查詢用戶的信息。
package org.springframework.security.core.userdetails; public interface UserDetailsService { UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; }
獲取到用戶信息后,注入到哪里去呢?
那肯定是注入到認證處理類中的,框架利用AuthenticationManager(接口)來進行認證。
總結:UserDetailService只單純地負責存取用戶信息,除了給框架內的其他組件提供數據外沒有其他功能。而認證過程是由AuthenticationManager來完成的。
文章參考自外部博客:https://www.cnblogs.com/longfurcat/archive/2018/08/04/9417358.html